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 :
- Sie füllen die
DataTable
aus die für das Update verwendet wird. - Löscht die Zeile mit
Code = 1101
(zum Beispiel) direkt aus der Datenbank, d.h. Sie verwenden nicht dieDataTable
hier. Dies emuliert einen anderen Benutzer, der die Zeile mitCode = 1101
löscht aus einer anderen Anwendung. Oder ein anderer Teil in Ihrem Code, der die Zeile mitCode = 1101
löscht . - Wählt die Zeile mit
Code = 1101
aus aus derDataTable
, dies soll nur zeigen, dass es immer noch da ist, obwohl Sie es aus der Datenbank selbst gelöscht haben. - Bearbeitet die
Quantity
Spalte in der Zeile mitCode = 1101
in derDataTable
. Dies muss getan werden, sonst wird der Aufruf von Update diese Zeile beim Aktualisieren ignorieren. - 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
.