Laden...

AutoIndex Wert nach speicheren eines neuen Datensatzes

Letzter Beitrag vor 15 Jahren 6 Posts 1.274 Views
AutoIndex Wert nach speicheren eines neuen Datensatzes

verwendetes Datenbanksystem: SQL Server 2005
Hi

Ev. ist das ja eine dumme Frage. Aber ich habe schon seit jahren das folgende Problem.

Neuen Datensatz erstellen mit AddRow, die Row mit daten befüllen, an die Table anfügen und das dann auf die DB speichern. Alles kein Problem.

Aber wie bekomme ich das DataRow Objekt welches die neuen Daten enthält dazu, den Wert des Autoindex Feldes (z.b. ID) nach dem speichen aktuellen Wert anzuzeigen. (neuRow["ID"] liefert immer noch NULL).

Gruss Markus

Vielleicht muß man vorher sowas wie einen "commit" ausführen?

Don't forget, you never know what tomorrow brings - so live a little every day.

Du wirst nicht drum herum kommen, die neuen Daten aus der DB zu lesen, vor allem wenn die DB per Trigger etc. selbstständig Daten verändert. Den autowert bekommst du übrigens mit

SELECT @@IDENTITY

Das funktioniert aber nur bei der Nutzung von Transaktionen zuverlässig, da das Kommando immer die letzte eingefügte ID zurück gibt. Wenn zwischen deinem INSERT und dem SELECT ein anderer ein INSERT gemacht hat, ist deine ID weg.

Lars

Dafür gibt es Scope_Identity.
Das gibt die letzte ID des aktuellen Gültigkeitsbereichs zurück, d.h. wenn nach Dir ein anderer einen Insert macht und Du danach

select Scope_Identity()

...ausführst, kriegst Du trotzdem DEINE letzte ID zurück.

Eine Möglichkeit, sich das zu sparen, jedem INSERT ein SELECT hinterherzuschießen, und dann die Rückantwort wieder in die DataTables einzupflegen, ist, die PrimKeys nicht in der DB zu generieren, sondern im Client.

Bei Einzel-Clients kann man als Datentyp hierfür sogar Int nehmen, bei Multiuser-Datenbanken muß man System.Guid nehmen, um auszuschließen, daß 2 Clients einen Datensatz mit demselben PrimKey einspeichern.
Bei int-Schlüsselspalten kann man einfach DataColumn.AutoIncrement=true setzen, bei Guid muß man das DataTable_NewRow-Ereignis bemühen, um der NewRow gleich eine ID zu verpassen.

In der DB muß dafür die Schlüsselgenerierung natürlich abgeschaltet sein.

Der frühe Apfel fängt den Wurm.

Eine Möglichkeit, sich das zu sparen, jedem INSERT ein SELECT hinterherzuschießen, und dann die Rückantwort wieder in die DataTables einzupflegen, ist, die PrimKeys nicht in der DB zu generieren, sondern im Client.

ist vorallem sehr nett, wenn solche datenbanken irgendwann mal mit einer dritten mischen muss; bei autoincrement ids hat man es schwer, guid-ids helfen da schon eher. man muss es sich nur angewöhnen.