Hallo,
ich habe ein echt seltsammes Problem.
Ich führe mehrere DB-Aktionen in einer Transaktion aus.
In einer Schleife werden ständig Insert-Commands ausgeführt und anschließend ein "Select @@Identity".
Mein Problem ist, wenn ein "Select @@Identity" ausgeführt wird, alle weiteren Insert-Befehle immer wieder die in die selbe Zeile in der Tabelle schreiben. Natürlich ist die neue LastInsertId wieder der Wert wie bei der ersten.
In der Tabelle steht zum Schluss die Werte des letzten Insert-Befehls aus der Schleife.
Begin Transaction
Insert into A ... value = 100...
Select @@Identity -> gibt mir z.B. 10
Insert into A ... value = 200 ...
Select @@Identity -> bringt wieder die 10 zurück
Transaction.Commit()
...
Select * from A where... -> Ergebnis ist der letzte Eintrag, im Bsp. die 200.
An was könnte das liegen?
Frage ich nicht die LastInsertId ab, funktioniert alles.
.
hallo AlfameisterT,
versuch es mit der Funktion SCOPE_IDENTITY(), sie gibt den letztzen Identitätswert im selben Gültigkeitsbereich zurück.
-yellow
Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).
Mein Blog: Yellow's Blog auf sqlgut.de
Hallo,
es handlet sich um einen SQL-Server.
SCOPE_IDENTITY() hatte ich schon versucht, leider ohne Erfolg.
Ich habe mal zum Spaß die ganze SQL Abfolge direkt in der SQL-Console vom SQLServer-Manager eingegeben.
Da hat es funktioniert.
Ich verzweifle noch. Bei anderen Anwendungen hat das immer funktioniert, die LastInsertId in einer Transaktion abzufragen.
Kann es sein, dass irgendein Trigger vom SQL Server nicht kommt, bzw. das die Abfrage zu schnell nach dem Insert statt findet?
.
Ich sag es ungern, aber mit GUIDs als Primärschlüssel hättest Du die Probleme nicht.
Es sollte aber auch mit Autowerten gehen.
Wie machst Du die Transaktionen:*über System.Transactions? *über System.Data.SqlClient.SqlTransaction *über direkten SQL-Code?
Ich verwende meistens System.Transactions. Da sollte es mit SCOPE_IDENTITY() klappen.
Hallo,
ich verwende System.Data.SqlClient.SqlTransaction.
Ich werds dann mal mit System.Transactions versuchen.
Das seltsamme ist wirlich, das dieses Vorgehen bis vor einer Weile noch funktioniert hat. Die Datenbank war zwischenzeitlich auf einem anderen Server. Kann es an Einstellungen des DB-Servers oder der Datenbank liegen?
Nachtrag:
leider kein Erfolg. Ich vermute mal da hat der SQL Server irgendein Problem.