Scope identity

martedì 02 ottobre 2007 - 16.39

_J_ Profilo | Senior Member

salve ragazzi,

vorrei ricavare lato c# l'ultimo record appena inserito in un campo identity ,e il suo valore immetterlo in una variabile di sessione..
forse ho sbagliato stanza, ma credo il problema sia nell'istruzione sql, ecco perchè ho postato qui il problema...
io ho fatto così:

string cmd = "SELECT SCOPE_IDENTITY()";
SqlConnection oConn = new SqlConnection(ConfigurationManager.ConnectionStrings["dati_generali"].ConnectionString);
SqlCommand oCommand = new SqlCommand(cmd, oConn);
try
{
oConn.Open(); //apro la connessione...
}
catch //in caso di problemi
{
oConn.Close(); //chiudi connessione
oConn.Open(); //e riapri
}

TextBox1.Text =oCommand.ExecuteScalar().ToString();
oConn.Close();

Session["cod_p"] = TextBox1.Text;//l'identity, che è pure chiave prim, mi serve nelle pagine successive


ma non funziona... come posso trattare un identity in questo caso?


_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."

lbenaglia Profilo | Guru

>vorrei ricavare lato c# l'ultimo record appena inserito in un
>campo identity ,e il suo valore immetterlo in una variabile di
>sessione..
>string cmd = "SELECT SCOPE_IDENTITY()";
>SqlConnection oConn = new SqlConnection(ConfigurationManager.ConnectionStrings["dati_generali"].ConnectionString);
>SqlCommand oCommand = new SqlCommand(cmd, oConn);

>ma non funziona... come posso trattare un identity in questo
>caso?

Ovviamente non funziona perché quel command viene eseguito in uno scope differente rispetto a quello che ha inserito l'ultima riga.
Potresti usare la funzione IDENT_CURRENT('table_name') ma te lo sconsiglio caldamente dato che otterresti una "istantanea" del valore che 1ms dopo non ti assicurerebbe più la sua validità.

Il modo migliore per gestire il problema consiste nell'incapsulare le operazioni di INSERT in stored procedure che restituisca l'ID generato IN QUELLO SCOPE tramite SCOPE_IDENTITY() come valore di ritorno o parametro di output.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Teech Profilo | Expert

Di solito uso questo sistema
Creo un command così composto:

strSQL="INSERT INTO Tabella (Campo1_ID, Campo2) VALUES (1,'AAA');" + _
"SELECT @@IDENTITY"

Quando eseguo il command lo faccio attraverso un ExecuteScalar e mi viene restituito l'identity generato dalla INSERT...

Questo è il link per maggiori dettagli
http://technet.microsoft.com/it-it/library/ms187342.aspx

Ciao
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

lbenaglia Profilo | Guru

>Di solito uso questo sistema
>Creo un command così composto:
>
>strSQL="INSERT INTO Tabella (Campo1_ID, Campo2) VALUES (1,'AAA');"
>+ _
> "SELECT @@IDENTITY"

Ciao Maurizio,

Utilizzando la tecnica appena esposta, ad ogni esecuzione avverranno le fasi di analisi sintattica e semantica del comando, la sua compilazione ed esecuzione.
Incapsulando il tutto in una stored procedure avresti diversi vantaggi, alcuni dei quali sono riassunti in questi post:
http://tinyurl.com/s662
http://tinyurl.com/s664

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Teech Profilo | Expert

Grazie della dritta
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

_J_ Profilo | Senior Member

ciao,
ho fatto come ha detto lbenaglia, ed in effetti si lavora molto meglio gestendo le cose con le stored...

cmq entrambi mi siete stai di grandissimo aiuto!
grazie ancora!
_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."
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