SqlCommand e Scope_Identity

martedì 13 febbraio 2007 - 15.43

cldparisi Profilo | Newbie

Framework 2.0 e Sql Server 2005 / 2000

Invece di costruirmi la stringa sql concatenando i vari valori utilizzo i parametri e poi dopo aver assegnato al SlqCommand il commandText aggiungo i vari parametri, tutto funziona bene tranne che se poi eseguo un "select SCOPE_IDENTITY() " mi torna sempre Null.
Con SqlProfiler ho visto che vengono eseguite queste due istruzioni:

exec sp_executesql N'INSERT INTO testTrigger (tipo, data) VALUES (@Insert0, @Insert1)',N'@Insert0 nvarchar(15),@Insert1 nvarchar(15)',@Insert0=N'new insert tipo',@Insert1=N'new insert tipo'

SELECT SCOPE_IDENTITY()


Effettivamente se le lancio anche direttamente da SqlServer la funzione mi trona semrpe Null, immagino perchè non consideri le due istruzioni nello stesso "ambito", infatti se invece delle due righe sopra eseguo queste:


INSERT INTO testTrigger (tipo, data) VALUES ('new insert tipo', 'new insert tipo')

SELECT SCOPE_IDENTITY()

La funzione mi torna regolarmente l'identity.

considerato che:
- devo utilizzare l'esecuzione con i parametri aggiungendoli al command
- non posso utilizzare @@IDENTITY perchè potrei avere Triger for insert con altri insert
- non posso utilizzare IDENT_CURRENT('testTrigger') perchè potrebbero esserci più insert contemporanei

qualcuno ha suggerimenti per aggirare il problema?

Speravo che in SqlCommand,SqlConnection o SqlTransaction ci fosse qualche proprietà che mi restituisse l'identity ma non ho trovato niente

--
Claudio P.


======================================================

A chi interessa ho risolto in questo modo.
Ho aggiunto alla mia stringa sql "Select @UltimoID=SCOPE_IDENTITY()" e al Command ho aggiunto unparametro i Output:

param = New SqlParameter() param.ParameterName = "@UltimoId" param.Direction = ParameterDirection.Output param.Size = 50 Comm.Parameters.Add(param)

Dopo aver eseguito il command mi recupero il valore del parametro di output:

Comm.Parameters("@UltimoId").Value



Brainkiller Profilo | Guru

>A chi interessa ho risolto in questo modo.
>Ho aggiunto alla mia stringa sql "Select @UltimoID=SCOPE_IDENTITY()"
>e al Command ho aggiunto unparametro i Output:

Ciao,
vedo solo ora il tuo Thread, e ti confermo che è la tecnica che uso generalmente anche io. Aggiunta di un parametro di tipo Output e da dentro la Stored Procedure lo valorizzo con @@identity o scope_identity()
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/
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