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
DataTableaus 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 dieDataTablehier. Dies emuliert einen anderen Benutzer, der die Zeile mitCode = 1101löscht aus einer anderen Anwendung. Oder ein anderer Teil in Ihrem Code, der die Zeile mitCode = 1101löscht . - Wählt die Zeile mit
Code = 1101aus aus derDataTable, dies soll nur zeigen, dass es immer noch da ist, obwohl Sie es aus der Datenbank selbst gelöscht haben. - Bearbeitet die
QuantitySpalte in der Zeile mitCode = 1101in 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 .