いよいよ今回の本題である変更通知機能を実装します。まずは変更通知を受けた際の動作を記述します。
' イベント(Notification)が発生したときの処理
Private Sub OnMyNotification(ByVal sender As Object, _
ByVal args As OracleNotificationEventArgs)
'OracleNotificationEventArgsのROWIDを基に、変更行データを取得
For Each detailRow As DataRow In args.Details.Rows
Dim rowid As String = detailRow("Rowid").ToString
Dim sqlupdate = _
"SELECT emp.*, emp.rowid FROM emp WHERE rowid = '" + rowid + "'"
Dim con2 As New OracleConnection("USER ID=scott;DATA SOURCE=
ORCL10GR2;PASSWORD=tiger;PERSIST SECURITY INFO=true;")
Dim cmd2 As New OracleCommand(sqlupdate, con2)
con2.Open()
Dim dr2 As OracleDataReader = cmd2.ExecuteReader
Dim iRow As Integer
If dr2.Read Then
'OracleNotificationEventArgs.ResourceNamesより
'オブジェクト名を取得
Dim msgtitle As String = _
args.ResourceNames(0).ToString + "が変更されました"
Dim msgdesc As String = _
"EMPNO=" + dr2("empno").ToString + " ENAME=" + dr2("ename").ToString _
+ "が変更されました。" & vbNewLine & "表示を更新しますか?"
'ボタンはYesNoかつモーダル表示
If MsgBox(msgdesc, _
MsgBoxStyle.YesNo + MsgBoxStyle.SystemModal, msgtitle) = _
DialogResult.Yes Then
For iRow = 0 To gvEmp.Rows.Count - 1
If gvEmp.Rows(iRow).Cells(0).Value = _
dr2("empno").ToString Then
gvEmp.Rows(iRow).Selected = True
Exit For
End If
Next
'更新されたデータをDataGridViewに表示
empOracleDataAdapter1.Fill(Emp1.Emp)
End If
End If
con2.Close()
Next
End Sub
OracleNotificationEventArgsからは表1のような情報を取得可能です。今回はDetailsよりROWID、ResourceNamesより変更されたオブジェクト名を取得しています。
| プロパティ | 説明 |
|---|---|
| Details | 現行の通知に関する詳細情報を含む |
| Info | 通知のデータベース・イベントを示す |
| ResourceNames | 現行の通知に関連するデータベース・リソースを示す |
| Source | 通知のデータベース・イベント・ソースを戻す |
| Type | 通知のデータベース・イベント・タイプを戻す |
| 表1 OracleNotificationEventArgsから取得可能な情報 | |
次にフォームのコンストラクタに変更通知のイベントハンドラを追加します。ポート番号は通信可能な任意の番号を指定してください。
Public Sub New()
' この呼び出しは、Windows フォーム デザイナで必要です
InitializeComponent()
' InitializeComponent() 呼び出しの後で初期化を追加します
empOracleConnection1.Open()
'変更通知用のポートを指定します
OracleDependency.Port = 1005
Dim dep As New OracleDependency(empSelectOracleCommand1)
empSelectOracleCommand1.Notification.IsNotifiedOnce = False
'イベントハンドラを追加
AddHandler dep.OnChange, _
New OnChangeEventHandler(AddressOf OnMyNotification)
End Sub
実装した変更通知機能の動作を確認しましょう。まずはアプリケーションをデバッグ実行します(図12)。
アプリケーションを表示させたまま、EMP表に変更を加えます。ここではSQL Developerを使用してSCOTTのSALを変更しています。余談となりますが、SQL Developerは無償で利用できる多機能クライアントツールですので、SQL*Plusなどで開発をしている方はぜひ一度触ってみてください(図13)。
変更をコミットすると、表示中の列に対しての変更を通知するダイアログが表示されます(図14)。
[はい]をクリックすると変更内容がアプリケーションにも反映されます(図15)。変更を反映させることにより変更後の最新データを確認し、それに対して修正を加えることが可能です。この機能により、再表示・再入力のロスを最小限にとどめることができます。
行の追加に関しても、図16のように通知されます。
パラメータのInfoプロパティを参照することにより、UPDATEされたのかINSERTされたのかを知ることも可能です。ここではソースコードが長くなるため省きましたが、要件によってはメッセージや処理を切り替える方がよいでしょう。
本連載は今回で最終回となります。最近になって増えてきたとはいえ、Oracleと.NETを組み合わせた開発に関する情報はまだまだ潤沢とはいえない状況です。ここで解説した情報が皆さまのお役に立てれば幸いです。
米国でOracleデータベースの最新版である11gが発表され、ODP.NET、ODTの新バージョンの話も聞こえてきました。新バージョンではさらに便利な機能が多数追加される予定です。私個人としても大変心待ちにしており、正式リリースの折にはまた何らかの形でお伝えできればと思います。
ご愛読ありがとうございました。それでは、実りのある開発を。(連載完)
Copyright © ITmedia, Inc. All Rights Reserved.