第7回 ASP.NETにおけるデータ更新処理VB6開発者のためのASP.NET開発入門(4/5 ページ)

» 2008年03月28日 00時00分 公開
[宮崎 昭世(Microsoft MVP for ASP/ASP.NET)日立ソフトウェアエンジニアリング]

複数端末からの更新時の排他制御

 では、ASP.NETでは、複数端末からのDB更新でデータを上書きしないようにするためにはどのようにすればいいのであろうか?

 Webアプリでは、楽観的排他制御という仕組みを使うことが多い。楽観的排他制御はデータを取得したタイミングと更新しようとするタイミングでDB上のデータが変更されていない場合(=ほかの端末から更新されていない場合)のみ、DB更新を行う方法である。

 この楽観的排他制御についても、ASP.NETでは簡単に実装することができる。これついにて、以下で実際に実装してみよう。

更新時に他端末から更新されていないかチェックするように変更(1)
SqlDataSourceコントロールのスマート・タグで[データ・ソースの構成]をクリックする。

更新時に他端末から更新されていないかチェックするように変更(2)
[データ ソースの構成]ダイアログが開くので、[次へ]ボタンを1回クリックし、[Selectステートメントの構成]ページを表示し、[詳細設定]ボタンをクリックする。

■更新時に他端末から更新されていないかチェックするように変更(3)
[SQL生成の詳細オプション]ダイアログが開くので、[オプティミスティック同時実行制御]チェックボックスにチェックを入れ、[OK]ボタンをクリックする。

 この設定を行うことにより、ほかの端末から更新されていた場合にはDB更新を行わないようになる。ただし、このままだと利用者がDB更新に失敗したかどうかは分からない。

 次は、DB更新に失敗した場合にメッセージを表示する方法について見ていこう。

 まず、DetailsViewコントロールのItemUpdatedイベント・ハンドラを、次の画面の手順で追加する。

DB更新に失敗した場合にメッセージを表示する方法(1)
DetailsViewコントロールのItemUpdatedイベント・ハンドラを追加する。
  (1)DetailsViewコントロールを選択し、[プロパティ]ウィンドウで[イベント]ボタンをクリックする。
  (2)[ItemUpdated]イベントをダブル・クリックすると、イベント・ハンドラが追加される。

 次に、追加されたイベント・ハンドラに次のコードを記述する。

Protected Sub DetailsView1_ItemUpdated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpdatedEventArgs) Handles DetailsView1.ItemUpdated
  If (e.AffectedRows = 0) Then
    Label1.Text = "更新できませんでした"
  End If
End Sub

DB更新に失敗した場合にメッセージを表示する方法(2)
DBの更新に失敗したかをチェックするコードを追加する。太字になっているコードの1行目では、実際に更新された行数を確認し、更新されていない(つまり「0」行)場合に、2行目で、Labelコントロールにエラー・メッセージを設定している。

 DetailsViewコントロールのItemUpdatedイベント・ハンドラ(=DetailsView1_ItemUpdatedメソッド)のパラメータでは、DB更新処理に関する情報が取得できるようになっている。ここで処理結果を判断することにより、利用者へDB更新が成功したかどうかを知らせることができるのである。

 実際に実行してみよう。

更新時に他端末から更新されていないかチェックするように変更 − 実行結果(1)
先ほどと同様に、ブラウザに詳細ページが表示された状態で[Ctrl]+[N]キーを押すと、同じページが別のウィンドウで表示される。双方とも[編集]リンク・ボタンをクリックし編集状態とする。
  (1)左のウィンドウでは、[au_lname]フィールドに「Bill」と入力する。
  (2)右のウィンドウでは[au_fname]フィールドに「Johnson」と入力する。
  (3)「Bill」と入力したウィンドウの[更新]リンク・ボタンをクリックする。
  (4)「Johnson」と入力したウィンドウの[更新]リンク・ボタンをクリックする。

更新時に他端末から更新されていないかチェックするように変更 − 実行結果(2)
双方のウィンドウに更新結果が表示される。
  (1)先に[更新]リンク・ボタンをクリックしたウィンドウでは正しく更新が行えたことが確認できる。
  (2)後から[更新]リンク・ボタンをクリックしたウィンドウには「更新できませんでした」というエラーが表示されていることが確認できる。

 このように、ほとんどコードを記述することなく、DB更新時にデータの上書きを防ぐ処理を実装することができる。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。