SCOPE_IDENTYTY

giovedì 21 luglio 2005 - 12.17

PEPE Profilo | Senior Member

Salve,
ho un db sqlserver 2000 con una tabella che ha id, nome, cognome.
L'id e' int con identità si e incremento 1, in pratica un contatore.

Quello che devo fare e' iunserire un nome in questa tabella ed utilizzare l'id creato per effettuare altri aggiornamenti su altre tabelle. Queste sono solo prove che faccio per studio :D.
ho un oggetto datarow che contiene il nome ed il cognome dell'utente e voglio inserirlo nella tabella. quello che dovrei fare e' fare l'inserimento e poi fare una select dell'ultimo elemento inserito tutto all'interno della stassa transazione in modo da evitare possibili errori. Ho letto pero che se io faccio una insert del tipo INSERT INTO tblUsers (nome, cognome) VALUES (@NOME, @COGNOME) SELECT SCOPE_IDENTITY() AS id posso in un'unico batch riuscire a recuperare il nuovo id con una proprietà updatedrowsource dell'oggetto comando o l'evento rowupdated del dataadapter, senza dover fare di nuovo la select. Ora però non ho trovato esempi che spiegano come scrivere il codice per fare questa cosa. Io ho provato a fare un po di tentativi utilizzando un dataadapter ma.......passo :D.
Volevo chiedervi se cortesemente avete un esempio abbastanza semplice che fa capire come fare un operazione di inserimento di questo tipo e recuperare quindi l'id creato.

Vi ringrazio per la vostra disponibilità,
Luca.

Cteniza Profilo | Guru

Se l'insert into lo fa il dataadapter si preoccupa da solo di recuperare l'ultimo id inserito.
Mentre se il comando lo scrivi tu ti consiglio di fare una piccola stored procedure.

CREATE PROCEDURE myStored
@Description char(16),
@Identity int OUT
AS
INSERT INTO MyTabe (Description)
VALUES(@Description)
SET @Identity = @@Identity
RETURN @@ROWCOUNT


PEPE Profilo | Senior Member

Ciao,
scusami se non sono molto pratico ma nella store procedure che hai fatto che differenza c'e' tra la @ e la @@??


Cteniza Profilo | Guru

La @ singola identifica le variabili
@@identity invece è la variabile che restituisce il numero.
La puoi sostituire (a volte è indicato) con SCOPE_IDENTITY()


micto27 Profilo | Senior Member

se non vuoi usare una stored procedure puoi comunque utilizzare un'istanza di SqlCommand valorizzando la proprietà CommandText con la concatenazione di 2 statement (separati da ";"):
CommandText = "Insert into table(a, b, c) values(v1, v2, v3);select @@identity

a questo punto:

dim newId as Int32 = mioCommand.ExecuteScalar

nella variabile newId avrai a disposizione il valore dell'ID assegnato alla riga inserita.

Ciao, Michele.

PEPE Profilo | Senior Member

ottimo!!! appena sto al lavoro lo provo :D.

Ciao e grazie.

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