ますます、ネタ切れの危機です(;^_^A


今回はADO.NET絡みでのSqlDataAdapterの話です。


更新処理の話を前に少ししました。


例えば、こういう状況を考えてみましょう。


DataGridViewにデータが表示されていて、ユーザが書き換えています。


そして、更新ボタンを押してDBに更新をかけようとしています。


ここでSqlDataAdapter.Update()を使って更新しようとした時に、他のユーザが先に更新をしていて、更新できなかったとする。


初期状態では、SqlDataAdapterのプロパティのContinueUpdateOnErrorがFalseになっています。


これは、どういう状況を生み出すかというと、最初の更新エラーが発生したところで例外が発生し、その前に更新したところはRollbackにより元に戻ります。


これだけ見ると良さそうですね。


が、しかし、例えば、実は他のユーザが、こちらが変更しようとしていた行と同じ行を3行先に更新していたとします。


つまり、今エラーが発生した行を何らかの方法でエラーが発生しないように回避したとして、このユーザはあと2回もエラーが発生して更新処理が途中でとまるのです。


よくわからない方は次のような場面を考えてみてください。


あるサイトでユーザ登録をあなたはしようとしています。


必要な個所を書き込んで登録ボタンを押しました。


しかし、ふりがなが半角でエラーになりました。


直して、登録ボタンを押しました。


今度は郵便番号がないとエラーが出ました。


また、直して、登録ボタンを押します。


今度はメールアドレスが確認用のとで同じではないとエラーがでました。


さて、あなたはどうです?


どうせなら、一度登録ボタンを押したら、すべてのエラー個所を一度に指摘してほしいと思いませんか?


そんな時はContinueUpdateOnErrorをTrueに設定します。


すると、更新処理においてある行を更新できなかったとしても例外は発生せず次の行の更新処理を続けます。


ここで気づいたあなたはすごい!


でも、更新できなかった行はどうやって判別するの?


そうです!


安心してください。


DataGridViewでは、エラーが発生した行の先頭にびっくりマークが表示されます。


ただし、これは更新処理をした後に


DataGridView1.Refresh();


を呼び出しておかないと、表示されません。


もちろんこの処理は全ての行が更新されるか、されないかのどちらかでないとダメである場合には使えないシナリオです。


その時々に合わせて使ってみてください。