Frage zu UpdateCommand bei SqlDataAdapter

07/03/2009 - 18:00 von M.Erlinger | Report spam
Hallo

ich hàtte folgende Frage/Problem mit dem SqlDataAdapter und dem
SqlServer2005. Ich verwende beim Erstellen des SqlDataAdapter den
CommandBuilder, um Insert/Update/Delete-Commands zu erstellen.
Warum wird bei manchen Tabellen der UPDATE so erstellt:
1. UPDATE xxx SET column=xxx, WHERE Prim_Key = PrimKEyValue
und manchmal aber sieht der UPDATE so aus:
2. UPDATE xxx SET column=xx, WHERE Prim_key = PrimKEyValue
AND
Col1=Column1Value AND Col2=Column2Value

AND

Ich habe nàmlich das Problem, dass wenn ich 2 (oder mehr) Änderungen
an dem selben Datensatz durchfürhre, den UPDATE jedesmal auslöse, und
der Update ist wie oben bei "2" angelegt, dass ich die Exception
"Parallelitàtsverletzung : Der UpdateCommand hat sich auf 0 der
erwarteten 1 Datensàtze
ausgewirkt"
bekomme.
Jetzt kann ich mir natürlich überall d. Update-Command per Hand
anlegen und codieren. Aber wieso gibt es dann Tabellen in meiner
Applikation, bei denen der Update wie unter "1" beschrieben aussieht,
so dass in der WHERE-Bedingung nur der Prim.Key verwendet wird.

Kann mir dazu bitte jemand weiterhelfen ??
Danke & schönen Gruß
Michael
 

Lesen sie die antworten

#1 Elmar Boye
07/03/2009 - 19:01 | Warnen spam
Hallo Michael,

"M.Erlinger" schrieb ...

ich hàtte folgende Frage/Problem mit dem SqlDataAdapter und dem
SqlServer2005. Ich verwende beim Erstellen des SqlDataAdapter den
CommandBuilder, um Insert/Update/Delete-Commands zu erstellen.
Warum wird bei manchen Tabellen der UPDATE so erstellt:
1. UPDATE xxx SET column=xxx, WHERE Prim_Key = PrimKEyValue
und manchmal aber sieht der UPDATE so aus:
2. UPDATE xxx SET column=xx, WHERE Prim_key = PrimKEyValue
AND Col1=Column1Value AND Col2=Column2Value
AND



Grundsàtzlich wird der generierte Befehl über die ConflictOption gesteuert:
http://msdn.microsoft.com/en-us/lib...ption.aspx

Wobei für den Vergleich nur einefache Datentypen verwendet werden
können, nicht aber z. B. LOB Datentypen wie NTEXT, IMAGE und
die MAX-Datentypen.

Ich habe nàmlich das Problem, dass wenn ich 2 (oder mehr) Änderungen
an dem selben Datensatz durchfürhre, den UPDATE jedesmal auslöse, und
der Update ist wie oben bei "2" angelegt, dass ich die Exception
"Parallelitàtsverletzung : Der UpdateCommand hat sich auf 0 der
erwarteten 1 Datensàtze ausgewirkt" bekomme.



Das ist letztendlich eine zweite Sache.

Werden bei dem Update die Tabellenspalten durch ein Trigger
veràndert oder enthàlt die Tabelle z. B. einen Timestamp (RowVersion)
so mußt Du die Daten nach dem UPDATE erneut abrufen. In der Form
SELECT Spaltenliste FROM Schema.Tabelle WHERE PKSpalte = @PK
was Du in dem Adapter, den Du für CommandBuilder verwendest, als
SelectCommand hinterlegen solltest.

Und da der SQL Client batchfàhig ist, kann das auch direkt an
das generierte UpdateCommand anhàngt werden.
Dabei muß allerdings UpdateRowSource = FirstReturnedRecord
gesetzt werden, da dies der CommandBuilder unterdrückt:
http://msdn.microsoft.com/en-us/lib...ource.aspx

Die (etwas saubere aber auch ein bisschen kompliziertere)
Alternative ist es, den Befehl im SqlDataAdapter.RowUpdated
Ereignis auszuführen.

Jetzt kann ich mir natürlich überall d. Update-Command per Hand
anlegen und codieren. Aber wieso gibt es dann Tabellen in meiner
Applikation, bei denen der Update wie unter "1" beschrieben aussieht,
so dass in der WHERE-Bedingung nur der Prim.Key verwendet wird.



bei der Variante 1.) besteht in Mehrplatzumgebungen immer die
Gefahr, dass Du Änderungen eines anderen überschreibst,
deswegen sollte man nicht tun.

Gruß Elmar

Ähnliche fragen