VegetaSSJ5
24-06-2009, 20:42
Salve a tutti, è da un po' che non posto in questa sezione, ma devo dire che passo spesso a leggerla, trovando delle piacevoli argomentazioni e suggerimenti. :)
Mi trovo a sviluppare un applicativo web in classic asp che si interfaccia ad un db SQL su Server 2008 SP1. Dovrei utilizzare alcune utili stored procedure e per gestire gli eventuali errori devo intercettare il loro valore di ritorno. Come indicato da MS in questa (http://support.microsoft.com/kb/164485) pagina, uso la seguente sintassi per chiamare la sp e prendere il valore di ritorno:<%
Set cn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command")
cn.Open "data source name", "userid", "password"
Set cmd.ActiveConnection = cn
cmd.CommandText = "sp_test"
cmd.CommandType = adCmdStoredProc
' Ask the server about the parameters for the stored proc'
cmd.Parameters.Refresh
' Assign a value to the 2nd parameter.'
' Index of 0 represents first parameter.'
cmd.Parameters(1) = 11
cmd.Execute
%>
Calling via method 1<BR>
ReturnValue = <% Response.Write cmd.Parameters(0) %>Il valore di ritorno si trova quindi in cmd.Parameters(0).
Per quanto riguarda invece le stored procedure gli errori vengono gestiti n questo modo:DELETE FROM table WHERE condition
IF @@ERROR <> 0
BEGIN
RAISERROR('ERROR in delete from table', 1, 1)
RETURN (-1)
END
In effetti con una stored procedure come la precedente, cioè contenente solo una query, chiamandola dalla pagina asp, in caso di errore mi ritrovo in cmd.Parameters(0) proprio il valore corretto, cioè -1. Se invece la stored procedure contiene più di una query, come la seguente, anche in caso di errore in cmd.Parameters(0) non c'è nulla (anzi IsEmpty(cmd.Parameters(0)) è True).BEGIN TRAN
DELETE FROM table1 WHERE condition
IF @@ERROR <> 0
BEGIN
RAISERROR('ERROR in delete from table1', 1, 1)
ROLLBACK TRAN
RETURN (-1)
END
DELETE FROM table2 WHERE condition
IF @@ERROR <> 0
BEGIN
RAISERROR('ERROR in delete from table2', 1, 1)
ROLLBACK TRAN
RETURN (-1)
END
COMMIT TRAN
In una sp come la precedente direi che è fondamentale intercettare l'errore per informare della riuscita o meno della transazione, ma il valore di ritorno per qualche motivo non c'è e non riesco a capire cosa c'è che non va.
Ho provato chissà quante volte e in tutti i modi a chiamare la stored procedure, a cambiare il codice all'interno della stored procedure, ma senza venirne a capo. Ho googlato anche un bel po' in cerca di qualche suggerimento ma niente. Siete la mia ultima spiaggia... :D
Un grazie in anticipo e un saluto alla sezione! ;)
Mi trovo a sviluppare un applicativo web in classic asp che si interfaccia ad un db SQL su Server 2008 SP1. Dovrei utilizzare alcune utili stored procedure e per gestire gli eventuali errori devo intercettare il loro valore di ritorno. Come indicato da MS in questa (http://support.microsoft.com/kb/164485) pagina, uso la seguente sintassi per chiamare la sp e prendere il valore di ritorno:<%
Set cn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command")
cn.Open "data source name", "userid", "password"
Set cmd.ActiveConnection = cn
cmd.CommandText = "sp_test"
cmd.CommandType = adCmdStoredProc
' Ask the server about the parameters for the stored proc'
cmd.Parameters.Refresh
' Assign a value to the 2nd parameter.'
' Index of 0 represents first parameter.'
cmd.Parameters(1) = 11
cmd.Execute
%>
Calling via method 1<BR>
ReturnValue = <% Response.Write cmd.Parameters(0) %>Il valore di ritorno si trova quindi in cmd.Parameters(0).
Per quanto riguarda invece le stored procedure gli errori vengono gestiti n questo modo:DELETE FROM table WHERE condition
IF @@ERROR <> 0
BEGIN
RAISERROR('ERROR in delete from table', 1, 1)
RETURN (-1)
END
In effetti con una stored procedure come la precedente, cioè contenente solo una query, chiamandola dalla pagina asp, in caso di errore mi ritrovo in cmd.Parameters(0) proprio il valore corretto, cioè -1. Se invece la stored procedure contiene più di una query, come la seguente, anche in caso di errore in cmd.Parameters(0) non c'è nulla (anzi IsEmpty(cmd.Parameters(0)) è True).BEGIN TRAN
DELETE FROM table1 WHERE condition
IF @@ERROR <> 0
BEGIN
RAISERROR('ERROR in delete from table1', 1, 1)
ROLLBACK TRAN
RETURN (-1)
END
DELETE FROM table2 WHERE condition
IF @@ERROR <> 0
BEGIN
RAISERROR('ERROR in delete from table2', 1, 1)
ROLLBACK TRAN
RETURN (-1)
END
COMMIT TRAN
In una sp come la precedente direi che è fondamentale intercettare l'errore per informare della riuscita o meno della transazione, ma il valore di ritorno per qualche motivo non c'è e non riesco a capire cosa c'è che non va.
Ho provato chissà quante volte e in tutti i modi a chiamare la stored procedure, a cambiare il codice all'interno della stored procedure, ma senza venirne a capo. Ho googlato anche un bel po' in cerca di qualche suggerimento ma niente. Siete la mia ultima spiaggia... :D
Un grazie in anticipo e un saluto alla sezione! ;)