none
Parallelitätsverletzung bei UpdateCommand RRS feed

  • Frage

  • Hallo zusammen,

    ich hole Daten per DbDataAdapter aus einer Datenbank und befülle damit ein DataSet. Bei der SQL-Abfrage wird nach einem bestimmten Primary-Key abgefragt. Ist der nicht zu finden, kann die Tabelle im befüllten DataSet auch leer sein.

    Wenn die Tabelle leer ist, werden aus einer anderen Tabelle gewisse DataRows in diese DataTable importiert (ImportRow).

    Anschließend versuche ich meine Änderungen in der DB zu speichern:

    myAdapter.Update(dataTable);
    dataTable.AcceptChanges();

    Habe auch folgendes versucht:

    myAdapter.Update(dataSet);
    dataTable.AcceptChanges();

    Wie ich es auch drehe und wende, ich bekomme die Daten nicht in der Datenbank gespeichert. Entweder es läuft ohne Fehler durch, es ist aber nichts gespeichert, oder ich bekomme einen komischen Fehler "Fehler: Parallelitätsverletzung : Der UpdateCommand hat sich auf 0 Datensätze ausgewirkt."

     

    Was ist denn da los? Außerdem, weshalb wird überhaupt das Update-Command ausgeführt, wenn ich doch über meine SQL-Abfrage gar keine Resultate aus der DB und damit eine DataTable mit 0 Zeilen bekomme? Eigentlich sollte doch hier das Insert-Command ausgeführt werden.

    Donnerstag, 24. Juni 2010 18:16

Antworten

  • Hallo,

    bei ImportRow wird der DataRowState der Zeile übernommen.
    Wenn Du die Zeilen via Fill aus einem DataAdapter in eine andere
    DataTable eingelesen hast, so ist der Zustand normalerweise Unchanged,
    zumindest wenn AcceptChangesDuringFill auf der Voreinstellung (true) steht.

    In den Fällen müsstest Du zudem SetAdded aufrufen
    oder aber AcceptChangesDuringFill auf False setzen.

    Da aber bei Dir das UpdateCommand ausgeführt wird, überprüfe
    Deinen Code daraufhin, wo  Du die Zeilen (nachträglich) veränderst.

    Ein AcceptChanges ist bei den Standard-Einstellungen der DataAdapter
    nicht erforderlich, da dies in Voreinstellung bereits geschieht, siehe
    AcceptChangesDuringUpdate
    Und da man mit Parallelitätsverletzungen bei optimistscher Aktualisierung
    immer rechnen muß, würde Dir ein AcceptChanges den Änderungstatus
    zurücksetzen, ohne dass die Daten in der Datenbank angekommen sind.

    Gruß Elmar

    • Als Antwort markiert SPDeveloperXP Freitag, 25. Juni 2010 07:41
    Donnerstag, 24. Juni 2010 20:47
    Beantworter

Alle Antworten

  • Hallo,

    bei ImportRow wird der DataRowState der Zeile übernommen.
    Wenn Du die Zeilen via Fill aus einem DataAdapter in eine andere
    DataTable eingelesen hast, so ist der Zustand normalerweise Unchanged,
    zumindest wenn AcceptChangesDuringFill auf der Voreinstellung (true) steht.

    In den Fällen müsstest Du zudem SetAdded aufrufen
    oder aber AcceptChangesDuringFill auf False setzen.

    Da aber bei Dir das UpdateCommand ausgeführt wird, überprüfe
    Deinen Code daraufhin, wo  Du die Zeilen (nachträglich) veränderst.

    Ein AcceptChanges ist bei den Standard-Einstellungen der DataAdapter
    nicht erforderlich, da dies in Voreinstellung bereits geschieht, siehe
    AcceptChangesDuringUpdate
    Und da man mit Parallelitätsverletzungen bei optimistscher Aktualisierung
    immer rechnen muß, würde Dir ein AcceptChanges den Änderungstatus
    zurücksetzen, ohne dass die Daten in der Datenbank angekommen sind.

    Gruß Elmar

    • Als Antwort markiert SPDeveloperXP Freitag, 25. Juni 2010 07:41
    Donnerstag, 24. Juni 2010 20:47
    Beantworter
  • Super, das row.SetAdded() hatte gefehlt!

    Vielen Dank für die Hilfe!

    Freitag, 25. Juni 2010 07:42