Vraag & Antwoord

Webprogrammeren & scripting

asp.net/SQL: Laatste toevoeging ID ophalen

9 antwoorden
  • Hallo allen, Als ik met een SQL statement iets heb ingevoegd in mijn database dan zou ik graag van het laatst toegevoegd het ID(in een variablele of label) hebben. Ik maak dus gebruik van identifiers in de database. Ik weet dat het kan met @@IDENTITY, maar verder kom ik niet. Dit heb ik tot nu toe. Ik gebruik ASP.NET in de taal VB met MS SQL Server 2000 [code:1:6a01d0b8d5] Dim conApplicatie as SqlConnection Dim ConnectionString As String = "Server=(local);database=Applicatie;Trusted_Connection=yes;" Dim SqlString As String Dim SqlString2 As String Dim dtrDataReader As SqlDataReader Dim cmdInsertOproep As SqlCommand SQLString = "INSERT Oproep(AfhandelingmanierID, PersoonID, ICTmedewerkerID, OnderwerpID, Omschrijving, Datum, Tijdsduur, Kilometers, Bijzonderheden) VALUES (@AfhandelingmanierID, @PersoonID, @ICTmedewerkerID, @OnderwerpID, @Omschrijving, @Datum, @Tijdsduur, @Kilometers, @Bijzonderheden)" conApplicatie = New SqlConnection(ConnectionString) conApplicatie.open() cmdInsertOproep = new SqlCommand(SqlString, conApplicatie) cmdInsertOproep.Parameters.Add("@AfhandelingManierID", chkAfhandelingManier.SelectedItem.Value) cmdInsertOproep.Parameters.Add("@PersoonID", drpPersoon.SelectedItem.Value) cmdInsertOproep.Parameters.Add("@ICTMedewerkerID", drpAfgehandeld.SelectedItem.Value) cmdInsertOproep.Parameters.Add("@OnderwerpID", rblOnderwerp.SelectedItem.Value) cmdInsertOproep.Parameters.Add("@Omschrijving", txtOmschrijving.text) cmdInsertOproep.Parameters.Add("@Datum", strDatum) cmdInsertOproep.Parameters.Add("@Tijdsduur", txtTijdsduur.text) cmdInsertOproep.Parameters.Add("@Kilometers", txtKilometers.text) cmdInsertOproep.Parameters.Add("@Bijzonderheden", txtBijzonderheden.text) dtrDatareader = cmdInsertOproep.ExecuteReader() SQLString2 = "SELECT @@IDENTITY AS 'RoosterID'" conApplicatie = New SqlConnection(ConnectionString) conApplicatie.open() cmdSelectID = new SqlCommand(SqlString2, conApplicatie) lblID.text=cmdSelectID.executescalar() dtrDatareader.close() conApplicatie.close() [/code:1:6a01d0b8d5][/code]
  • Ik heb geen oplossing voor je probleem, maar het valt me op dat je @@identity gebruikt. In MSSQL2000 heb je ook de beschikking over SCOPE_IDENTITY en IDENT_CURRENT (zie books online voor de details). Voor de meeste gevallen is SCOPE_IDENTITY een betere/veiligere keuze dan @@identity.
  • Ik denk niet dat het werkt zoals je het nu doet. Je opent namelijk een nieuwe connectie, naar de database en dus zal @@IDENTITY waarschijnlijk NULL geven. Snap ook niet waarom je [i:3120661543]ExecuteReader()[/i:3120661543] aanroept van het object [i:3120661543]cmdInsertOproep[/i:3120661543]. Je gebruikt de DataReader niet erna, dus dat is een beetje zinloos. Ik zou misschien in jouw tweede stap bijv. [i:3120661543]SELECT RoosterID FROM Oproep WHERE AfhandelingmanierID=@AfhandelingmanierID AND PersoonID=@PersoonID AND ...etc..[/i:3120661543] doen. Dit geeft je altijd de juiste ID terug (tenzij er dubble records kunnen voorkomen, maar dan klopt je tabel niet). En andere manier is je eerste query uit te breiden als volgt: [i:3120661543]INSERT Oproep(AfhandelingmanierID...ect...; SELECT @@IDENTITY AS 'RoosterID';[/i:3120661543] Je runt het dan in één connectie en zal dan kloppen (mits je geen triggers hebt die weer in andere tabellen iets toevoegen). Je voert dus een insert uit en je krijgt een 'RoosterID' terug. (Ik zou het dan ook in een sp gooien en dan een NewId terug laten geven, maar dit moet je zelf beoordelen). p.s. En kijk ook even naar de functies die Annie heeft gepost, die zijn ook handig.
  • Zie ook eens dit artikel: http://www.kamath.com/tutorials/tut007_identity.asp
  • De implementatie in MS SQL server deugt gewoon niet. Er is geen enkele functie die het volgende kan: Identity ophalen van 'de huidige sessie en tabel x'
  • [quote:2ae4a8a1c5="h4xX0r"]De implementatie in MS SQL server deugt gewoon niet.[/quote:2ae4a8a1c5]Onderbouwingen hiervoor? [quote:2ae4a8a1c5="h4xX0r"]Er is geen enkele functie die het volgende kan: Identity ophalen van 'de huidige sessie en tabel x'[/quote:2ae4a8a1c5]Ehhh... Wat doen @@IDENTITY en SCOPE_IDENTITY dan?
  • [quote:d7baed38c2="h4xX0r"]De implementatie in MS SQL server deugt gewoon niet. Er is geen enkele functie die het volgende kan: Identity ophalen van 'de huidige sessie en tabel x'[/quote:d7baed38c2] Wat een onzin. Omdat je een functie mist, deugt meteen de implementatie niet? :roll: En als je zonodig meerdere inserts in je eigen scope wil doen, dan kan je toch ook zelf even die waarde tussentijds opslaan met SCOPE_IDENTITY. /edit: hmm, mosterd na maaltijd ;)
  • [quote:3f3719e2c8="Remytje"][quote:3f3719e2c8="h4xX0r"]De implementatie in MS SQL server deugt gewoon niet.[/quote:3f3719e2c8]Onderbouwingen hiervoor?[/quote:3f3719e2c8] [quote:3f3719e2c8="Annie"][quote:3f3719e2c8="h4xX0r"]De implementatie in MS SQL server deugt gewoon niet. Er is geen enkele functie die het volgende kan: Identity ophalen van 'de huidige sessie en tabel x'[/quote:3f3719e2c8] Wat een onzin. Omdat je een functie mist, deugt meteen de implementatie niet? :roll: En als je zonodig meerdere inserts in je eigen scope wil doen, dan kan je toch ook zelf even die waarde tussentijds opslaan met SCOPE_IDENTITY. [/quote:3f3719e2c8] Nee, dat kan niet. In mijn voorbeeld zijn er triggers ;) De implementatie kan dan misschien wel deugen, maar ik heb tot nu toe geen betrouwbare methode gezien i.c.m. MS SQL Server om het id op te halen die ik wil [b:3f3719e2c8]en[/b:3f3719e2c8] gegarandeerd werkt. Er bestaan DBMS'en die dit probleem op een andere manier oplossen. [quote:3f3719e2c8="Remytje"] [quote:3f3719e2c8="h4xX0r"]Er is geen enkele functie die het volgende kan: Identity ophalen van 'de huidige sessie en tabel x'[/quote:3f3719e2c8]Ehhh... Wat doen @@IDENTITY en SCOPE_IDENTITY dan?[/quote:3f3719e2c8] * IDENT_CURRENT returns the last identity value generated for a specific table in any session and any scope. * @@IDENTITY returns the last identity value generated for any table in the current session, across all scopes. * SCOPE_IDENTITY returns the last identity value generated for any table in the current session and the current scope. [url=http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ia-iz_82i1.asp]bron[/url]
  • [quote:1d5d48750e="h4xX0r"]Nee, dat kan niet. In mijn voorbeeld zijn er triggers ;)[/quote:1d5d48750e]Dan zie ik nog niet het probleem? Dit kan je toch met SCOPE_IDENTITY oplossen? [quote:1d5d48750e="h4xX0r"]De implementatie kan dan misschien wel deugen, maar ik heb tot nu toe geen betrouwbare methode gezien i.c.m. MS SQL Server om het id op te halen die ik wil [b:1d5d48750e]en[/b:1d5d48750e] gegarandeerd werkt. Er bestaan DBMS'en die dit probleem op een andere manier oplossen.[/quote:1d5d48750e]Die lossen dit volgens mij op door een aparte Identity-tabel bij te houden. Je kan dit ook zelf in SQL Server doen door een tabel aan te maken, maar in mijn ogen is dit niet nodig (ik zie jouw probleem namelijk niet). De Identity-tabel (int Identity, varchar TableName) kun je dan benaderen dmv een sp [i:1d5d48750e]GenerateId('tableName')[/i:1d5d48750e] die een nieuwe tabel-unieke-Id teruggeeft. Je kan ook evt. voor een database-unieke-Id kiezen (is wat makkelijker). (Misschien hoef je geeneens een aparte Identy-tabel aan te maken, door dit met de systeem-tabellen van SQL Server op te lossen.) [quote:1d5d48750e="h4xX0r"]* IDENT_CURRENT returns the last identity value generated for a specific table in any session and any scope. * @@IDENTITY returns the last identity value generated for any table in the current session, across all scopes. * SCOPE_IDENTITY returns the last identity value generated for any table in the current session and the current scope. [/quote:1d5d48750e]Het was een retorische vraag :wink:.

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.