Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
.NET Framework
RECUPERO DI ULTERIORI RISULTATI DA UNA QUERY DI INSERT
sabato 28 agosto 2010 - 17.20
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
anza
Profilo
| Newbie
39
messaggi | Data Invio:
sab 28 ago 2010 - 17:20
[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
4
messaggi | Data Invio:
sab 28 ago 2010 - 17:45
Che DB Utilizzi?
anza
Profilo
| Newbie
39
messaggi | Data Invio:
sab 28 ago 2010 - 17:46
Microsoft SQL server
alexmed
Profilo
| Guru
1.186
messaggi | Data Invio:
sab 28 ago 2010 - 21:12
Ciao
Puoi usare la SCOPE_IDENTITY()
http://msdn.microsoft.com/it-it/library/ms190315.aspx
Ciao
alexmed
anza
Profilo
| Newbie
39
messaggi | Data Invio:
dom 29 ago 2010 - 23:54
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
8.814
messaggi | Data Invio:
lun 30 ago 2010 - 02:10
>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
Torna su
Stanze Forum
Elenco Threads
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 !