Newsgroup: it.comp.www.asp
Titolo: Domandona:

Le stored Procedure:
come si interrogano?
Non mi serve di conoscere il codice VBS, ma, magari, un po' di teoria.
So scrivere le SP, ma non so accedervi tramite pagina web.
Nettuno

Nettuno wrote:

Non le ho ancora usate ma vado a leggere nel breviario ("ASP in a
Nutshell" by O'Reilly)
oggetto: Recordset, metodo:open
rsobj.Open
vntSource,vntActiveConnection,lngCursorType,lngLockType,lngOptions
vnt = variant
lng=long
lngOptions prevede adCmdText: Sql statement
                              adCmdTable: Nome tabella
                              adCmdStoredProcedure: StoredProcedure
                              adCmdUnknown: sconosciuto (fai tu)
ovviamente va incluso ADOVBS.inc
(non conosco i valori lng corrispondenti)
spero ti sia utile
--
Alessandro Cara
P.S. lo stesso puo essere usato nell'oggetto Command

 Non mi serve di conoscere il codice VBS, ma, magari, un po' di teoria.
Bisogna cominciare col dire che, in generale, le SP non sono fatte per
essere
"interrogate", ma per eseguire delle operazioni (di solito di Update)
piuttosto
pesanti dall'interno del database stesso.
Questo per "chiudere dentro" al database quelle operazioni che sarebbe
inefficiente
fare esternamente con un cursore esterno, oppure per avvantaggiarsi
dall'accesso
diretto che si puo' avere tramite l'SQL specifico del server.
Di solito una SP viene eseguita e basta.
Non tutti i server poi, consentono ad una SP di "ritornare" un recordset che
possa essere "consultato". In generale se una SP vuole ritornare dei valori,
e' bene che utilizzi una tabella temporanea.
Di solito, se il server consente alla SP di ritornare un recordset, questo
viene "letto" esattamente come ogni altro recordset, la SP viene eseguita
utilizzando Set rs = Conn.Execute("EXEC nome_sp"), e questo crea il
recordset
che contiene il risultato della stessa.
Davide


Comincio a capire (forse): mettiamo che io abbia una tabella che ho chiamato
"esempio" e la mia stored procedure (in un raptus di follia ho voluto
mettere una banalissima SELECT * FROM miaTabella in SP) che chiamo
spMyStoredProcedure (tutto sommato comincio a preferire myFairLady, ma
comunque...),
e poi sempre nella sp ci metto una riga tipo questa:
(io uso Ms SQL7 e posso far ritornare valori alle SP)
CREATE         PROCEDURE spMyStoredProcedure
SELECT * INTO #miaTempTable FROM miaTabella
END
e con
Set rs = Conn.Execute("EXEC spMyStoredProcedure")
(dando per scontato che Conn sia una connessione col Database giusto e coi
permessi giusti... e un sacco di altre cose)
io ottengo un recordset con dentro i risultati della select.
In effetti devo fare una select MOLTO complicata e ritornare una sola
tabella.
MA
dato che devo passare tre parametri alla SP e che quindi mi assume il
seguente aspetto:
CREATE         PROCEDURE spMyStoredProcedure @param1 tipodati(nn), @param2
tipodati(yy), @param3 tipodati(zz) AS
SELECT * INTO #myTempTable FROM myTable WHERE campo1 = @param1 AND campo2 =
@param2 AND campo3 = @param3
END
e adesso viene il punto contro il quale mi si e' sfranto il "tridente" piu'
e piu' volte (e capirai, col Nickname che mi ritrovo...)
passare i parametri alla SP.
La documentazione di ASP dice un sacco di cose a riguardo, ma gli esempi non
mi funzionano:
<inizia codice ASP variamente commentato>
Public Function GetSP(param1, param2, param3)
[...cut... dim vari...]
 Set Conn = Server.CreateObject("ADODB.Connection")
 Set Cmd = Server.CreateObject("ADODB.Command")
 Set Rst = Server.CreateObject("ADODB.Recordset")
'istanziano, rispettivamente gli oggetti connessione, comando e recordset
 dim strConnection
 strConnection="DRIVER={SQL Server}; SERVER=ServerNT; DATABASE=mioDbSQL7;
UID=sa; PWD="
 objConn.ConnectionString = strConnection
 objConn.Open
'inizializzano, creano e aprono la connessione
Set Cmd.ActiveConnection = Conn
'inizializza la connessione su cui mandare il comando
Cmd.CommandText = "spMyStoredProcedure"
'indovina un po'?
Cmd.CommandType = adCmdStoredProc
'costante presa da ADOVBS.inc che dice cos'e' il comando inviato attraverso
al connessione
Cmd.Parameters.Append Cmd.CreateParameter("@param1",?1,?2,?3, param1)
Cmd.Parameters.Append Cmd.CreateParameter("@param2",?1,?2,?3, param2)
Cmd.Parameters.Append Cmd.CreateParameter("@param3",?1,?2,?3, param3)
'Penso che possa bastare, al primo dei tre cmd.Parameters mi ritorna errore
(illegal parameters)
'Tieni presente che non ho capito un beneamato picchio su cosa va messo in
cmd.Parameters dopo il nome che ha il parametro nella sp, ossia quei
simboletti ?1, ?2, ?3, credo riguardino il tipo di dati, ma proprio non
capisco.
'La documentazione tratta 'sta cosa in modo molto superficiale, mentre
invece... io mi sto deprimendo come non ritenevo possibile deprimersi
-( non potevo semplicemete prendermi una cotta per... che so... Anna Falchi?
Almeno se te la sogni la notte e' piacevole, ma con una SP che fai? Vabbe'
sto celiando ^_______^
'le righe che seguono dovrebbero essere corrette:
 Rst.CursorLocation = adUseClient
'devo capire a che mi serve...
 Rst.Open Cmd
'apre il recordset col comando e i parametri (magari) teste' definiti
 Set Cmd = Nothing
' rilascia il comando
 Set Rst.ActiveConnection = Nothing
'rilascia la connessione del recordset
 Conn.Close
' chiude la connessione
 Set GetSP = Rst.Clone
'dovrebbe servire a copiare il recordset da un'altra parte (GetSP) in modo
da riutilizzarla senza andare a rompere le scatole al serve SQL
 Rst.Close
'Manda a nanna anche il recordset
end function
' fine della storia.
<fine del codice ASP>
Questa funzione dovrebbe ritornarmi un recordset, ma mi si inchioda quando
vado a definire i parametri da passare alla SP.
(sto dando per scontato che sia stato creato un oggetto che abbia, tra i
suoi metodi, anche GetSP(param1, param2, param3)
Spero di essere stato esauriente,
grazie per l'attenzione che mi hai dedicato ^___^
Nettuno

 capisco.
<ZAC>
Allora, dalla documentazione di ADO si trova che:
Metodo CreateParameter (ADO)
Crea un nuovo oggetto Parameter con le proprietà specificate.
Sintassi
Set parametro = comando.CreateParameter (Nome, Tipo, Direzione, Dimensione,
Valore)
Valore restituito
Restituisce un oggetto Parameter.
Nome: e' un nome che identifica il parametro
Tipo: valore numerico che identifica il tipo (intero, long, stringa) del
parametro
Direzione: se il parametri e' INPUT o OUTPUT
Dimensione: lunghezza del parametro, se specifichi una Stringa come tipo di
parametro,
dovrai specificare la lunghezza della stringa stessa.
Valore: valore da assegnare al parametro stesso
Nel codice di esempio da te riportate la Create viene usata in combutta con
la Append
per creare ed "appiccicare" un parametro in una sola linea.
Il "nome" del parametro non e' obbligatorio che sia uguale al nome del
parametro della
Stored Procedure, i parametri vengono dati "in pasto" alla SP nell'ordine in
cui sono
"appendurati" all'oggetto Command.
Il parametro Tipo puo' valore:
adBigInt Intero con segno da 8 byte (DBTYPE_I8).
adBinary Valore binario (DBTYPE_BYTES).
adBoolean Valore booleano (DBTYPE_BOOL).
adBSTR Stringa di caratteri a terminazione Null (Unicode) (DBTYPE_BSTR).
adChar Valore String (DBTYPE_STR).
adDate Valore Date (DBTYPE_DATE). Si tratta di una data memorizzata come
Double, la cui parte intera rappresenta il numero di giorni a partire dal 30
dicembre 1899, mentre la parte frazionaria rappresenta la frazione di un
giorno.
adDBDate Valore data (ggmmaaaa) (DBTYPE_DBDATE).
adDBTime Valore tempo (oommss) (DBTYPE_DBTIME).
adDBTimeStamp Indicatore data/ora (ggmmaaaaoommss più una frazione in
miliardesimi) (DBTYPE_DBTIMESTAMP).
adDecimal Valore numerico esatto con grado di precisione e di scala fisso
(DBTYPE_DECIMAL).
adDouble Valore con virgola mobile in precisione doppia (DBTYPE_R8).
adInteger Intero con segno da 4 byte (DBTYPE_I4).
adLongVarBinary Valore binario lungo (solo oggetto Parameter).
adLongVarChar Valore String lungo (solo oggetto Parameter).
adLongVarWChar Valore stringa a terminazione Null lungo (solo oggetto
Parameter).
adNumeric Valore numerico esatto con grado di precisione e di scala fisso
(DBTYPE_NUMERIC).
adSingle Valore con virgola mobile in precisione semplice (DBTYPE_R4).
adSmallInt Intero con segno da 2 byte (DBTYPE_I2).
adTinyInt Intero con segno da 1 byte (DBTYPE_I1).
adUnsignedBigInt Intero senza segno da 8 byte (DBTYPE_UI8).
adUnsignedInt Intero senza segno da 4 byte (DBTYPE_UI4).
adUnsignedSmallInt Intero senza segno da 2 byte (DBTYPE_UI2).
adUnsignedTinyInt Intero senza segno da 1 byte (DBTYPE_UI1).
adUserDefined Variabile definita dall'utente (DBTYPE_UDT).
adVarBinary Valore binario (solo oggetto Parameter).
adVarChar Valore String (solo oggetto Parameter).
adVariant Variant di automazione (DBTYPE_VARIANT).
E molti altri ancora, ma spero che questi ti bastino...
Il parametro "direzione" specifica se il parametro e' in Input/Output, tutti
e due etc., i suoi
valori sono:
adParamUnknown Indica se la direzione del parametro è sconosciuta.
adParamInput Valore predefinito. Indica un parametro di input.
adParamOutput Indica un parametro di output.
adParamInputOutput Indica sia un parametro di input che di output.
adParamReturnValue Indica un valore restituito.
Non mi e' ben chiaro che cavolo vuol dire "unknown"... comunque.
Esempio idiota:
Set cmdByRoyalty = Server.CreateObject("ADODB.Command")
cmdByRoyalty.CommandText = "byroyalty"
cmdByRoyalty.CommandType = adCmdStoredProc
Set prmByRoyalty = cmdByRoyalty.CreateParameter("percentage", adInteger,
adParamInput)
cmdByRoyalty.Parameters.Append prmByRoyalty
prmByRoyalty.Value = intRoyalty
(tratto di peso dalla documentazione ADO).
Spero che questo possa metterti sulla strada buona...
Davide

 Spero che questo possa metterti sulla strada buona...
^___________________________________________________^
Tu che ne dici?
Ciao
e grazie
Nettuno

Ciao, questa sotto funziona benissimo con "ASP+SQL Server 7", ed č anche
semplicissima da utilizzare...
fa riferimento ad un db con una tabella in cui ci sono le monete preziose
possedute da vari personaggi di fantasia
es:
 Topolino ---> 2 monetaA, 5 monetaB, 3 monetaC
 Pippo     ---> 3 monetaC, 8 monetaF
etc...
su SQL Server ho creato una stored procedure del tipo:
****************************************************************************
******
CREATE PROCEDURE monetepossedute_sp(@personaggio varchar(20))
AS
 select * from monete_possesso where person=@personaggio
return
****************************************************************************
******
Da ASP lo richiamo cosě :
<%
set cnn1 = Server.CreateObject("ADODB.Connection")
cnn1.Open "FILEDSN=miodbase.dsn"
set rs1 = Server.CreateObject("ADODB.Recordset")
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = cnn1
'occhio !!!!!! Qui sotto c'č il succo del discorso    topolino č il
parametro passato alla sp !
cmd.CommandText = "monetepossedute_sp('topolino')"
Set rs1 = cmd.execute()
Do While not rs1.EOF
 Response.write(rs1.Fields("tipo_moneta"))
 %><br><%
rs1.movenext()
loop
cnn1.Close
%>
e l'output č una pagina HTML con :
monetaA
monetaB
monetaC
Spero di esserti stato utile !
Ciao !
Guga