Ga naar inhoud

asp.net/SQL: Laatste toevoeging ID ophalen


Aanbevolen berichten

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]
Link naar reactie
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.
Link naar reactie
[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?
Link naar reactie
[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 ;)
Link naar reactie
[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]
Link naar reactie
[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:.
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...