私のアプリケーションには、データベース テーブルの内容をユーザーに表示するコントロールがあります。このコントロールは、System.Data.DataSetオブジェクトに表示するデータを保持します。ユーザーは、コントロールに表示されたデータを変更できます。ユーザーの操作が完了すると、このデータはデータベースにコミットされます。
ユーザーがコントロールで編集を行っているときに、データベース テーブルのデータが外部プロセスによって変更されると (たとえば、いくつかの行が更新されるなど)、問題が発生します。ここでは、データの正確性の問題を無視して、ユーザーがコントロールで行った変更をコミットし、この外部プロセスによって行われた変更を上書きします。
を使用しSqlDataAdapterてデータベースを更新しています。説明されている使用例では、基になるデータベース テーブルが外部プロセスによって変更されていない場合、SqlDataAdapter.Update期待どおりに動作します。ただし、ユーザーがテーブルを編集しているときに外部プロセスがテーブルをいじったシナリオではSqlDataAdapter.Update、例外はスローされず、行が更新されなかったことを示す 0 が返されます。データセットの行に正しいデータが含まれていることを確認したのでRowState(つまりDataRowState.Modified)、メソッドに渡すデータが正しいことがわかりSqlDataAdapter.Updateます。
私の質問には2つの部分があると思います。
SqlDataAdapter.Update指定されたデータセットでデータベースを更新しないのはなぜですか?- なぜ静かに失敗するのですか?
このブログ エントリを読みましたが、私のコードはAcceptChangesどこにも呼び出されません。上で述べたように、 をチェックしたので、行が変更されたデータとして正しくマークされていることがわかりましたDataSet。RowState