Oracle独自の“変更通知機能”で同時実行性を向上.NETユーザー必見! Oracle 10gのお作法(5)(3/3 ページ)

» 2007年08月10日 00時00分 公開
[三谷亮太日本オラクル]
前のページへ 1|2|3       

変更通知を実装する

 いよいよ今回の本題である変更通知機能を実装します。まずは変更通知を受けた際の動作を記述します。

' イベント(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
リスト2 通知を受けた際にメッセージで確認し表示を更新する(VB.NET)
C#のコードを表示する

 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
リスト3 コンストラクタに変更通知のイベントハンドラを追加(VB.NET)
C#のコードを表示する

変更通知のテスト

 実装した変更通知機能の動作を確認しましょう。まずはアプリケーションをデバッグ実行します(図12)。

図12 アプリケーションのデバッグ実行 図12 アプリケーションのデバッグ実行

 アプリケーションを表示させたまま、EMP表に変更を加えます。ここではSQL Developerを使用してSCOTTのSALを変更しています。余談となりますが、SQL Developerは無償で利用できる多機能クライアントツールですので、SQL*Plusなどで開発をしている方はぜひ一度触ってみてください(図13)。

図13 EMP表に変更を加える 図13 EMP表に変更を加える

 変更をコミットすると、表示中の列に対しての変更を通知するダイアログが表示されます(図14)。

図14 変更を通知するダイアログ 図14 変更を通知するダイアログ

 [はい]をクリックすると変更内容がアプリケーションにも反映されます(図15)。変更を反映させることにより変更後の最新データを確認し、それに対して修正を加えることが可能です。この機能により、再表示・再入力のロスを最小限にとどめることができます。

図15 変更内容が反映された 図15 変更内容が反映された

 行の追加に関しても、図16のように通知されます。

図16 行の追加を通知するダイアログ 図16 行の追加を通知するダイアログ

 パラメータのInfoプロパティを参照することにより、UPDATEされたのかINSERTされたのかを知ることも可能です。ここではソースコードが長くなるため省きましたが、要件によってはメッセージや処理を切り替える方がよいでしょう。


 本連載は今回で最終回となります。最近になって増えてきたとはいえ、Oracleと.NETを組み合わせた開発に関する情報はまだまだ潤沢とはいえない状況です。ここで解説した情報が皆さまのお役に立てれば幸いです。

 米国でOracleデータベースの最新版である11gが発表され、ODP.NET、ODTの新バージョンの話も聞こえてきました。新バージョンではさらに便利な機能が多数追加される予定です。私個人としても大変心待ちにしており、正式リリースの折にはまた何らかの形でお伝えできればと思います。

 ご愛読ありがとうございました。それでは、実りのある開発を。(連載完)

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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