私のアプリケーションでは、データベーステーブルの内容をユーザーに表示するコントロールがあります。このコントロールは、System.Data.DataSet
オブジェクトに表示するデータを保持します。ユーザーはコントロールに表示されているデータを変更することができ、ユーザーが完了するとこのデータはデータベースにコミットされます。SqlDataAdapter.Updateがサイレントに失敗する
ユーザーがコントロールで編集中にデータベーステーブルのデータが一部の外部プロセス(たとえば、一部の行が更新された)によって変更されると問題が発生します。現時点でのデータの正確性の問題を無視して、ユーザーがコントロールで行った変更をコミットし、この外部プロセスによって加えられた変更を上書きすることです。
私はSqlDataAdapter
を使用してデータベースを更新しています。上記の使用例では、基になるデータベーステーブルが外部プロセスによって変更されていない場合、SqlDataAdapter.Update
は期待どおりに動作します。ただし、ユーザーが編集中に外部プロセスがテーブルを操作していた場合、SqlDataAdapter.Update
は例外をスローしませんが、更新された行がないことを示す0を返します。データセット内の行に正しいデータがあり、(つまりDataRowState.Modified
)の行があることを確認しましたので、私がSqlDataAdapter.Update
メソッドに渡すデータが正しいことがわかります。
私の質問には2つの部分があります。
SqlDataAdapter.Update
は、指定されたデータセットでデータベースを更新しないのはなぜですか?- なぜ静かに失敗していますか?
私はthis blog entryを読んでいると、私のコードはどこにでもAcceptChanges
を呼び出さない、と私は私の上に述べてきたように私は行が正しくデータを変更したものとしてマークされていることを知っているDataSet
のRowState
をチェックしています。
タイムスタンプが問題でした。 SqlDataAdapterがSqlCommandBuilderにラップされ、SqlDataAdapterのselectコマンドがタイムスタンプを取得しました。このタイムスタンプは、自動的に生成されたUPDATEコマンドがタイムスタンプをクエリの一部として使用したことを意味します。タイムスタンプを無視した明示的な更新コマンドを作成すると、問題が修正されました。SQLプロファイラを掘り起こすのは楽しいことではないので、私はただちにあなたの答えを見てほしかった:) – CadentOrange
@Philip Goh:私はただちに答えを見たことがあるとは知らない前。 =) – casperOne