これは、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で使用できます。 。