sql >> データベース >  >> RDS >> PostgreSQL

Dataadapterを使用した更新中にDBConcurrency例外が発生しました

    これは、DataAdapterが原因です Optimistic Concurrencyを使用します デフォルトでは。これは、データベースに存在しなくなった、または変更された行を更新しようとしている場合、DataAdapterからの更新を意味します。 上記の例外で失敗します。

    考えられるシナリオ

    • クライアントにデータを選択してから更新を送信する間に、別のユーザーがアプリケーションからこの行を削除または更新しています。
    • アプリケーションの他の場所からデータを削除している可能性があります。

    1. DataTableに入力します 更新に使用されます。
    2. Code = 1101の行を削除します (たとえば)データベースから直接、つまりDataTableを使用しない ここ。これは、Code = 1101で行を削除する別のユーザーをエミュレートしています 別のアプリケーションから。または、コード内の他の部分でCode = 1101の行を削除します 。
    3. Code = 1101の行を選択します DataTableから 、これは、データベース自体から削除した場合でも、まだ存在していることを示すためのものです。
    4. Quantityを編集します Code = 1101の行の列 DataTable内 。これを行う必要があります。そうしないと、Updateの呼び出しで更新時にこの行が無視されます。
    5. 更新を実行します。データベースに(もう)存在しない行を更新しようとしているため、例外がスローされます。

    Last Writer Winsを実装する場合 、次のコードを追加します:

    cb.ConflictOption = ConflictOption.OverwriteChanges;
    

    また、もう1つ考えられることがあります。それは、Decimalがある場合です。 /numeric DBの列として、データが同じように見えても、このエラーが発生する可能性があります。これは、小数の丸め誤差が原因です。

    重要な注意事項 :常にparameterized queriesを使用する必要があります ところで。この種の文字列連結は、SQL Injectionで使用できます。 。




    1. Oracle 12:コンマ区切りのリストに参加しますか?

    2. GI12.1.0.2とセグメンテーション違反をコンパイルできません

    3. MySQLユーザーにデータベースを作成させますが、自分のデータベースへのアクセスのみを許可します

    4. SQLServerでエラーメッセージ7325を修正する方法:「CLRタイプの列を公開するオブジェクトは分散クエリでは許可されていません」