Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
Web Services, XML
Stored Procedure
mercoledì 17 novembre 2010 - 14.00
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Elenco Tags
VB.NET
|
SQL Server 2008 R2
iif
Profilo
| Expert
713
messaggi | Data Invio:
mer 17 nov 2010 - 14:00
Ciao, ho creato una SP dove all'interno esegue due insert.
La prima fa una insert in una tabella prendendo come valori da inserire i parametri che imposto da codice
La seconda fa una insert into from utilizzando come filtro sulla select il valore @@identity
Fino qui tutto ok.
Ho creato un parametro come output per farmi ritornare il valore @@identity.
Il valore che ritorna è zero.
Cosa sbaglio?
Grazie
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
mer 17 nov 2010 - 14:49
>Ciao, ho creato una SP dove all'interno esegue due insert.
Ciao
>La prima fa una insert in una tabella prendendo come valori da
>inserire i parametri che imposto da codice
>La seconda fa una insert into from utilizzando come filtro sulla
>select il valore @@identity
>Ho creato un parametro come output per farmi ritornare il valore @@identity.
fai attenzione perchè la @@identity non torna necessariamente l'id appena inserito in una tabella. Meglio usare SCOPE_IDENITY().
Questo perchè, se mai dovessero esserci dei trigger che coinvolgono altre identità ad esempio, la prima ti tornerebbe l'ultimo degli identity inseriti, non quello della tabella che ti aspetteresti.
SCOPE_IDENTITY() invece torna quello con SCOPE (ambito) corretto. Ti consiglio di usare sempre SCOPE_IDENTITY se non vuoi rischiare di ottenere comportamenti indesiderati.
Detto questo, come dichiari i parametri di output nella sp?
Come la richiami per avere il param in output?
>Grazie
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
iif
Profilo
| Expert
713
messaggi | Data Invio:
mer 17 nov 2010 - 15:18
Da codice la inizializzo così:
cmd_tnt.Parameters.Add("@valore ", SqlDbType.Int) '.Direction = ParameterDirection.Output
cmd_tnt.Parameters("@valore").Value = 0
nella SP la dichiaro così:
@valore int output
il valore di ritorno
set @valore = SCOPE_IDENTITY()
Return
Da codice la rilevo così:
Ritorna_ID_Ordine = cmd_tnt.Parameters("@valore").Value
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
mer 17 nov 2010 - 15:43
>Da codice la inizializzo così:
>cmd_tnt.Parameters.Add("@valore ", SqlDbType.Int) '.Direction = ParameterDirection.Output
ehm.. ma hai commentato la direction..
poi come esegui il comando? Execute reader? Non query?
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
iif
Profilo
| Expert
713
messaggi | Data Invio:
mer 17 nov 2010 - 15:45
Questo il codice:
Public Function Ritorna_ID_Ordine() As Boolean
CN_tnt.ConnectionString = strConnessione
CN_tnt.Open()
cmd_tnt.CommandTimeout = 1800
cmd_tnt.Parameters.Clear()
cmd_tnt.Parameters.Add("@strTipoMerce", SqlDbType.VarChar, 1)
cmd_tnt.Parameters("@strTipoMerce").Value = ana_ordine.TipoMerce
cmd_tnt.Parameters.Add("@strmittente", SqlDbType.VarChar, 40)
cmd_tnt.Parameters("@strmittente").Value = ana_ordine.Mittente
cmd_tnt.Parameters.Add("@strcf_piva_mitt", SqlDbType.VarChar, 40)
cmd_tnt.Parameters("@strcf_piva_mitt").Value = ana_ordine.Cf_Piva_mitt
cmd_tnt.Parameters.Add("@strindir_mitt", SqlDbType.VarChar, 35)
cmd_tnt.Parameters("@strindir_mitt").Value = ana_ordine.Indir_mitt
cmd_tnt.Parameters.Add("@strcap_mitt", SqlDbType.VarChar, 5)
cmd_tnt.Parameters("@strcap_mitt").Value = ana_ordine.Cap_mitt
cmd_tnt.Parameters.Add("@strcomune_mitt", SqlDbType.VarChar, 40)
cmd_tnt.Parameters("@strcomune_mitt").Value = ana_ordine.Comune_mitt
cmd_tnt.Parameters.Add("@strprov_mitt", SqlDbType.VarChar, 2)
cmd_tnt.Parameters("@strprov_mitt").Value = ana_ordine.Prov_mitt
cmd_tnt.Parameters.Add("@strcontatto_mitt", SqlDbType.VarChar, 40)
cmd_tnt.Parameters("@strcontatto_mitt").Value = ana_ordine.Contatto_mitt
cmd_tnt.Parameters.Add("@stremail_mitt", SqlDbType.VarChar, 50)
cmd_tnt.Parameters("@stremail_mitt").Value = ana_ordine.Email_mitt
cmd_tnt.Parameters.Add("@strdestinatario", SqlDbType.VarChar, 40)
cmd_tnt.Parameters("@strdestinatario").Value = ana_ordine.Destinatario
cmd_tnt.Parameters.Add("@strindir_dest", SqlDbType.VarChar, 35)
cmd_tnt.Parameters("@strindir_dest").Value = ana_ordine.Indir_dest
cmd_tnt.Parameters.Add("@strcap_dest", SqlDbType.VarChar, 5)
cmd_tnt.Parameters("@strcap_dest").Value = ana_ordine.Cap_dest
cmd_tnt.Parameters.Add("@strcomune_dest", SqlDbType.VarChar, 40)
cmd_tnt.Parameters("@strcomune_dest").Value = ana_ordine.Comune_dest
cmd_tnt.Parameters.Add("@strprov_dest", SqlDbType.VarChar, 2)
cmd_tnt.Parameters("@strprov_dest").Value = ana_ordine.Prov_dest
cmd_tnt.Parameters.Add("@strdata_ritiro", SqlDbType.VarChar, 8)
cmd_tnt.Parameters("@strdata_ritiro").Value = ana_ordine.Data_ritiro
cmd_tnt.Parameters.Add("@strcolli", SqlDbType.VarChar, 3)
cmd_tnt.Parameters("@strcolli").Value = ana_ordine.Colli
cmd_tnt.Parameters.Add("@strpeso", SqlDbType.VarChar, 10)
cmd_tnt.Parameters("@strpeso").Value = ana_ordine.Peso
cmd_tnt.Parameters.Add("@strvolume", SqlDbType.VarChar, 10)
cmd_tnt.Parameters("@strvolume").Value = ana_ordine.Volume
cmd_tnt.Parameters.Add("@strtel_mitt", SqlDbType.VarChar, 15)
cmd_tnt.Parameters("@strtel_mitt").Value = ana_ordine.Tel_mitt
cmd_tnt.Parameters.Add("@strno_te", SqlDbType.VarChar, 80)
cmd_tnt.Parameters("@strno_te").Value = ana_ordine.No_te
cmd_tnt.Parameters.Add("@strora_disp_merce", SqlDbType.VarChar, 4)
cmd_tnt.Parameters("@strora_disp_merce").Value = ana_ordine.Ora_disp_merce
cmd_tnt.Parameters.Add("@strassicurazione", SqlDbType.VarChar, 10)
cmd_tnt.Parameters("@strassicurazione").Value = ana_ordine.Assicurazione
cmd_tnt.Parameters.Add("@stremail_dest", SqlDbType.VarChar, 50)
cmd_tnt.Parameters("@stremail_dest").Value = ana_ordine.Email_dest
cmd_tnt.Parameters.Add("@valore ", SqlDbType.Int)
cmd_tnt.Parameters("@valore ").Value = 0
cmd_tnt.Connection = CN_tnt
cmd_tnt.CommandText = "OTTIENI_ORDINE"
cmd_tnt.CommandType = CommandType.StoredProcedure
cmd_tnt.ExecuteNonQuery()
Ritorna_ID_Ordine = cmd_tnt.Parameters("@valore").Value
CN_tnt.Close()
End Function
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
mer 17 nov 2010 - 15:48
> cmd_tnt.Parameters.Add("@valore ", SqlDbType.Int)
> cmd_tnt.Parameters("@valore ").Value = 0
ok, come dicevo.. metti la direction:
cmd_tnt.Parameters("@valore ").Direction = ParameterDirection.Output
altrimenti non comunichi ad ADO che deve trattare il parametro come output
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
iif
Profilo
| Expert
713
messaggi | Data Invio:
mer 17 nov 2010 - 15:50
Metto output o ReturnValue?
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
mer 17 nov 2010 - 16:07
>Metto output o ReturnValue?
ReturnValue è una direction speciale, che non serve al tuo scopo, usa Output o InputOutput.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
iif
Profilo
| Expert
713
messaggi | Data Invio:
mer 17 nov 2010 - 16:08
Ora mi ritorna un valore nullo
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
mer 17 nov 2010 - 16:14
>Ora mi ritorna un valore nullo
ok, ora profila la chiamata con sql server profiler e vedi che cosa comunica ADO a sql..
perchè potresti aver preso errore e la sp non ti valorizza l'output param..
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
iif
Profilo
| Expert
713
messaggi | Data Invio:
gio 18 nov 2010 - 15:43
Ciao, ho risolto, ho dovuto settare il parametro di output dopo la prima insert, non capsco perchè il valore scope_identity lo perde dopo la seconda insert....mah
Grazie lo stesso.
Ciao.
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
gio 18 nov 2010 - 15:53
>Ciao, ho risolto, ho dovuto settare il parametro di output dopo
>la prima insert, non capsco perchè il valore scope_identity lo
>perde dopo la seconda insert....mah
certo.. se la seconda insert non altera l'identity, dopo il dml hai null
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Torna su
Stanze Forum
Elenco Threads
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?
Dopo esserti registrato potrai chiedere
aiuto sul nostro
Forum
oppure aiutare gli altri
Consulta le
Stanze
disponibili.
Registrati ora !