Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Select @@Identity in einer Transaktion
AlfameisterT
myCSharp.de - Member



Dabei seit:
Beiträge: 154

Themenstarter:

Select @@Identity in einer Transaktion

beantworten | zitieren | melden

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.




.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.996

beantworten | zitieren | melden

Welche DB?
private Nachricht | Beiträge des Benutzers
Yellow
myCSharp.de - Experte

Avatar #avatar-2347.png


Dabei seit:
Beiträge: 476

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
AlfameisterT
myCSharp.de - Member



Dabei seit:
Beiträge: 154

Themenstarter:

beantworten | zitieren | melden

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?


.
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3.728
Herkunft: Mauer

Guid

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
AlfameisterT
myCSharp.de - Member



Dabei seit:
Beiträge: 154

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers