PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Beim Aktualisieren mit Dataadapter ist eine DBConcurrency-Ausnahme aufgetreten

Dies liegt daran, dass DataAdapter verwendet Optimistic Concurrency standardmäßig. Das bedeutet, wenn Sie versuchen, eine Zeile zu aktualisieren, die nicht mehr in der Datenbank vorhanden ist oder sich geändert hat, erfolgt die Aktualisierung über den DataAdapter wird mit der oben genannten Ausnahme fehlschlagen.

Mögliche Szenarien :

  • Während Sie die Daten im Client auswählen und die Aktualisierung senden, löscht oder aktualisiert ein anderer Benutzer diese Zeile aus seiner Anwendung.
  • Es kann sein, dass Sie die Daten an einer anderen Stelle in Ihrer Anwendung löschen.

Zum Beispiel :

  1. Sie füllen die DataTable aus die für das Update verwendet wird.
  2. Löscht die Zeile mit Code = 1101 (zum Beispiel) direkt aus der Datenbank, d.h. Sie verwenden nicht die DataTable hier. Dies emuliert einen anderen Benutzer, der die Zeile mit Code = 1101 löscht aus einer anderen Anwendung. Oder ein anderer Teil in Ihrem Code, der die Zeile mit Code = 1101 löscht .
  3. Wählt die Zeile mit Code = 1101 aus aus der DataTable , dies soll nur zeigen, dass es immer noch da ist, obwohl Sie es aus der Datenbank selbst gelöscht haben.
  4. Bearbeitet die Quantity Spalte in der Zeile mit Code = 1101 in der DataTable . Dies muss getan werden, sonst wird der Aufruf von Update diese Zeile beim Aktualisieren ignorieren.
  5. Führt die Aktualisierung aus, dies löst die Ausnahme aus, da Sie versuchen, eine Zeile zu aktualisieren, die (nicht mehr) in der Datenbank existiert.

Wenn Sie Last Writer Wins implementieren möchten , Fügen Sie den folgenden Code hinzu:

cb.ConflictOption = ConflictOption.OverwriteChanges;

Außerdem gibt es noch eine weitere Möglichkeit:wenn Sie Decimal haben /numeric Als Spalten in der DB können sie diesen Fehler verursachen, obwohl die Daten gleich aussehen. Dies liegt an einem Dezimalrundungsfehler.

Ein wichtiger Hinweis :Sie sollten immer parameterized queries verwenden übrigens. Diese Art von String-Verkettungen ist offen für SQL Injection .