これは、DataAdapter
が原因です Optimistic Concurrency
を使用します デフォルトでは。これは、データベースに存在しなくなった、または変更された行を更新しようとしている場合、DataAdapter
からの更新を意味します。 上記の例外で失敗します。
考えられるシナリオ :
- クライアントにデータを選択してから更新を送信する間に、別のユーザーがアプリケーションからこの行を削除または更新しています。
- アプリケーションの他の場所からデータを削除している可能性があります。
例 :
-
DataTable
に入力します 更新に使用されます。 -
Code = 1101
の行を削除します (たとえば)データベースから直接、つまりDataTable
を使用しない ここ。これは、Code = 1101
で行を削除する別のユーザーをエミュレートしています 別のアプリケーションから。または、コード内の他の部分でCode = 1101
の行を削除します 。 -
Code = 1101
の行を選択しますDataTable
から 、これは、データベース自体から削除した場合でも、まだ存在していることを示すためのものです。 Quantity
を編集しますCode = 1101
の行の列DataTable
内 。これを行う必要があります。そうしないと、Updateの呼び出しで更新時にこの行が無視されます。- 更新を実行します。データベースに(もう)存在しない行を更新しようとしているため、例外がスローされます。
Last Writer Wins
を実装する場合 、次のコードを追加します:
cb.ConflictOption = ConflictOption.OverwriteChanges;
また、もう1つ考えられることがあります。それは、Decimal
がある場合です。 /numeric
DBの列として、データが同じように見えても、このエラーが発生する可能性があります。これは、小数の丸め誤差が原因です。
重要な注意事項 :常にparameterized queries
を使用する必要があります ところで。この種の文字列連結は、SQL Injection
で使用できます。 。