Stored Procedure

mercoledì 17 novembre 2010 - 14.00
Tag Elenco Tags  VB.NET  |  SQL Server 2008 R2

iif Profilo | Expert

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

>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

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

>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

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

> 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

Metto output o ReturnValue?

alx_81 Profilo | Guru

>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

Ora mi ritorna un valore nullo

alx_81 Profilo | Guru

>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

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

>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
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 !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5