Thomas Bandt

Über mich | Kontakt | Archiv

@@Identity - wirklich sinnvoll nach einem Insert?

Der SQL-Server kann's schon lange, und mit ADO.NET kann man @@Identity nun auch mit Access (OLEDB) verwenden. Am häufigsten wird man in diese Verlegenheit kommen, wenn man nach einem Insert den Primary-Key des letzten Datensatzes haben möchte.

Mit dem alten ADO ging das relativ easy via "rs.AddNew", "rs.Update" und "id = rs("pmkey")" - damit hatte man zu 100% die ID des neuen Datensatzes, den man via AddNew hinzugefügt hat.

Doch ist das auch bei einem @@Identity der Fall? Nein! Denn egal wie man den Befehl einsetzt, in hundertprozentige Relation zum neuesten Datensatz wird man ihn nie kriegen.

Im Klartext: @@Identity holt zwar immer die ID des aktuell letzten Records, der muss aber nicht der z.B. eben hinzugefügte sein. Das ist zwar bei den meisten Applikationen relativ unwahrscheinlich, aber die theroretische Möglichkeit, dass jemand quasi "gleichzeitig" ein Insert ausgeführt hat, sollte Bauchschmerzen bereiten - denn dann kann es durchaus sein, dass eben jener fremde Datensatz dazwischenrutscht und @@Identity so ein falsches Resultat liefert.

Die Lösung: aktuell ist es wohl die vernünftigste Lösung, wenn man als Primary-Key ein Feld vom Typ GUID (in Access: "Replikations-ID") verwendet, und dieses mit selbst generierten GUID's füttert. Das heißt man generiert eine GUID und fügt diese beim Insert manuell mit hinzu - und verzichtet so auf ein Feld z.B. vom Typ Autowert in Access.

Kommentare

  1. jack-geronimo schrieb am Dienstag, 29. Juni 2004 12:50:00 Uhr:

    Sie dir mal die SCOPE_IDENTITY() Function an...

    ...
    Returns the last IDENTITY value inserted into an IDENTITY column in the same scope. A scope is a module -- a stored procedure, trigger, function, or batch. Thus, two statements are in the same scope if they are in the same stored procedure, function, or batch.


    greetinx ;-)


« Zurück  |  Weiter »