[ Marko Medojević @ 27.12.2008. 18:43 ] @
| Nakon izvršenja INSERT komande potrebno mo je da mi program zapamti ID zadnjeg unosa. To sam izveo sa naredbom
Code: SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
Nju koristim na sledeći način:
Code:
SqlConnection konekcija = new SqlConnection(@"Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=galerija;Data Source=sun\sqlexpress");
SqlCommand insertKomanda = new SqlCommand();
insertKomanda.CommandText = String.Format("INSERT INTO slike(naziv, kat) VALUES('{0}', {1})", parNaziv, parKat);
insertKomanda.Connection = konekcija;
SqlCommand selectKomanda = new SqlCommand();
selectKomanda.CommandText = "SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]";
selectKomanda.Connection = konekcija;
konekcija.Open();
insertKomanda.ExecuteNonQuery();
int insertId = Convert.ToInt32(selectKomanda.ExecuteScalar());
konekcija.Close();
Znači između otvaranja i zatvaranja konekcije izvršava se INSERT naredba i SELECT SCOPE_IDENTITY() koji kupi zadnji ID.
Interesije me da li postoji mogućnost da, ako je neko u međuvremenu izvršio INSERT, dobijem ID njegovog unosa umesto mog? |
[ vujkev @ 27.12.2008. 19:51 ] @
Scope_identity() vraća poslednju vrednost unetu u identity kolonu u aktivnoj konekciji tako da je odgovor NE, uvek ćeš dobiti svoj ID.
"select @@identity" vraća poslenju vrednost nezavisno od konekcije
[ mmix @ 27.12.2008. 20:19 ] @
Nope, scope_identity vraca zadnji ID u trenutnom scope-u (kao sto mu i ime kaze) ne konekcije, poslednji ID generisan unutar sesije (konekcije) je @@IDENTITY. Ne postoji nacin da dobijes ID generisan u drugoj konekciji/transakciji sem preko IDENT_CURRENT (koji opet ima svojih problema). Scope oznacava trenutni kontekst konekcije, tj trenutni deo skripte koja se izvrsava, ne oznacava sesiju/konekciju. Realno ce ove dve vrednosti biti razlicite samo ako insert1 izazove neki triger koji uradi insert2, onda ce scope identity biti onaj iz insert1 a @@IDENTITY biti onaj iz insert2. Iz tog razloga je uvek bolje koristiti SCOPE_IDENTITY za slucaj da neko jednog dana nakaci trigger na tabelu.
Ako hoces da budes siguran da neko drugi nece ubaciti novi red izmedju tvoje dve komande ubaci obe u transakciju, insert ce onda da udari lock na tabelu i ID ce biti poslednji jer niko nece moci da ubaci novi red dok ne commitujes transakciju.
[ Marko Medojević @ 27.12.2008. 20:56 ] @
Hvala na odgovorima!
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.