Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

asp.net/SQL: Laatste toevoeging ID ophalen

Anoniem
None
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]
  • 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.
    bron
  • [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

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