RECUPERO DI ULTERIORI RISULTATI DA UNA QUERY DI INSERT

sabato 28 agosto 2010 - 17.20

anza Profilo | Newbie

[VB2008]

Ciao a tutti,
ho un database contenente 3 campi:

Codice(BigInt) contatore
Nome (char)
Cognome(char)


Data una query di insert del tipo:


DB_TB.Open()
Command_Save.CommandText = "INSERT INTO SCHEDAT(Nome,Cognome)" + _
" VALUES ('" & TxT_Nome.Text & "' , '" & Txt_Cognome.Text & "');"
Command_Save.ExecuteNonQuery()

DB_TB.Close()

esiste un modo per conoscere immediatamente alla fine deLla query di insert quale è il valore che assume in campo Codice NEL DB senza fare un'ulteriore query ?

Overcloked Profilo | Newbie

Che DB Utilizzi?

anza Profilo | Newbie

Microsoft SQL server

alexmed Profilo | Guru

Ciao
Puoi usare la SCOPE_IDENTITY()

http://msdn.microsoft.com/it-it/library/ms190315.aspx

Ciao

alexmed

anza Profilo | Newbie

Grazie per la dritta, riporto la soluzione che ho trovato in rete:


Uno dei problemi che più frequentemente mi vengono posti riguarda la possibilità di inserire un nuovo record in una tabella e di conoscere il valore assegnato dal DBMS al campo auto incrementante.

Questo problema è solitamente risolto, peraltro in modo brillante ed elegante, con una specifica stored procedure (SP) di SQL Server. Qualcuno, però, chiede come si può fare direttamente da codice, senza “scomodare” una stored procedure.

Ad un primo esame, non abbiamo la possibilità di inserire il record e subito dopo leggere il valore del campo IDENTITY, perché nel frattempo, tra la nostra scrittura del record e la nostra lettura della chiave, qualche altro utente potrebbe aver inserito un nuovo record.

Queste due operazioni, invece, devono essere fatte in un unico blocco, cioè devono essere eseguite in un’unica transazione (principio di “atomicità” della transazione).

A questo proposito c’è una particolarità di SQL Server che possiamo utilizzare per risolvere questo problema: in T-SQL possono essere eseguite più istruzioni in sequenza, senza soluzione di continuità, semplicemente separando ciascuna istruzione con un punto e virgola (;).

In questo modo le singole istruzioni saranno eseguite una dopo l’altra senza interrompere la transazione e restituendo, così, il corretto valore della colonna IDENTITY.

Un esempio di codice di questa tecnica è il seguente:

Dim cn As System.Data.SqlClient.SqlConnection
Dim cnStr = "Data Source = HP\SQL2008EXPRESS;" & _
"Initial Catalog=NOMEDATABASE;" & _
"Password=PIPPO;" & _
"User ID=sa;" & _
"Persist Security Info=True"
cn = New System.Data.SqlClient.SqlConnection(cnStr)
cn.Open()
Dim cmd As New System.Data.SqlClient.SqlCommand( _
"SET NOCOUNT ON; INSERT INTO Tabella (ANAnome) " & _
"VALUES ('De Ghetto Mario'); " & _
"SELECT SCOPE_IDENTITY() AS ANAID;", cn)
Dim risultato = cmd.ExecuteScalar()
MessageBox.Show("Il nuovo ID inserito è " & risultato)
cn.Close()
cn = Nothing

alx_81 Profilo | Guru

>Ad un primo esame, non abbiamo la possibilità di inserire il
>record e subito dopo leggere il valore del campo IDENTITY, perché
>nel frattempo, tra la nostra scrittura del record e la nostra
>lettura della chiave, qualche altro utente potrebbe aver inserito
>un nuovo record.
La scope_identity torna l'identity della transazione di scope corrente. Quindi ad essa, non interessa assolutamente se le altre transazioni inseriscono record.. Quindi non è vero quanto è detto qui. SCOPE_IDENTITY è quello che ti serve. Fai la tua insert e poi una bella select SCOPE_IDENTITY, punto e virgola o meno (questa non l'ho proprio colta.. visto che il ; è solo un terminatore e non è nemmeno richiesto da tutti gli statement. Probabilmente in futuro sarà necessario sempre di più nella sintassi); usa SCOPE_IDENTITY e non avrai problemi.
--
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5