ODP.NETおよびOracle Database 11gでのDatabase Change Notificationの使用

このチュートリアルでは、Oracle Data Provider for .NETおよびOracleデータベースでサポートされているDatabase Change Notification機能について紹介します。

約30分

このチュートリアルでは、以下のトピックについて説明します。

このアイコンの上にカーソルを置くと、このチュートリアルのすべてのスクリーンショットがロードされて、表示されます。 (警告: すべてのスクリーンショットが同時にロードされるため、ご使用のインターネット接続によってはレスポンス・タイムが遅くなる場合があります。)

注: 各手順に関連したスクリーンショットのみをロードして表示する場合は、それぞれの手順にあるアイコンの上にカーソルを置いてください。 個々のスクリーンショットはクリックすると、非表示になります。

Oracle Data Provider for .NETには、データベース・サーバーにおけるDatabase Change Notificationをサポートする通知フレームワークがあります。 Database Change Notificationを使用すると、問合せ結果セット、スキーマ・オブジェクト、またはデータベースの状態(キャッシュされたクライアント結果セットに影響を与える可能性がある)に変更が生じた場合に、登録したコールバック・ルーチンによりアプリケーションが通知を受け取ることができます。

この機能をODP.NETで使用すると、アプリケーションはクライアント側キャッシュ(たとえば、ADO.NETデータセット)を有効に利用することができます。 クライアントは、データベースへの接続を維持する必要はありません。 クライアントは、データベースに接続していない場合でも通知を受け取ることができます。

この機能の目的は、時間の経過とともに結果が時折変更される問合せや、大量のアクティブなデータベース接続を維持できないときの対応にあります。

このチュートリアルでは、アプリケーションにHR.EMPLOYEES表の値を含んでいるデータセット・グリッドが表示されます。 グリッドを移入すると、アプリケーションはデータベースから切断され、データが変更されたという通知を待ちます。 変更が検出されると、アプリケーションはデータベースに再接続して、データをリフレッシュします。

このチュートリアルでは、Database Change Notification機能の柔軟性を示すために、大量の変更がおこなわれたあとでも引き続き通知が登録される例や、変更がクライアントの問合せ結果に影響を与えるかどうかを行レベルで識別する例を紹介します。 この機能は、Oracle Database 10g Release 2ではDatabase Change Notification(DCN)と呼ばれています。Oracle Database 11gでは、この機能はContinuous Query Notification(CQN)に名前が変更されています。 これらの名前はいずれも同じ機能を指しています。

このチュートリアルを始める前に以下を確認してください。

Oracle Database 11gまたはOracle Database 10g Release 2データベース・サーバーをインストールして作成してあること。

Visual Studio 2005 with Visual C#をインストールしてあること。

Oracle Database 11gクライアントを使用してODP.NET 11gをインストールしてあるか、OTNからODP.NET 11gをインストールしてあること。

"Change Notification.zip"ファイルをダウンロードし、作業ディレクトリに解凍してあること。

ユーザーまたはロールにCHANGE NOTIFICATION権限が設定されていないと、変更通知コールバックを受け入れるアプリケーションを実行できません。

1.

Windowsのプログラム・メニューから、Visual Studioを起動します。 Visual StudioのViewメニューから「Server Explorer」を選択します。

Server Explorerパネルが開きます。

 

2.

Data Connections」を右クリックして、メニューから「Add Connection」を選択します。

Add Connectionダイアログ・ボックスが開きます。

 

3.

Add Connectionダイアログ・ボックスで、Data SourceがOracle Database Server (Oracle ODP.NET)に設定されていることを確認します。

注:Data SourceがOracle Database Server (Oracle ODP.NET)に設定されていない場合は、「Change」をクリックして、適切なデータソースとデータソース・プロバイダを選択します。

Change Data Sourceダイアログ・ボックスで、Data Sourceリストから「Oracle Database Server」を選択して、Data Providerドロップダウン・リストから「Oracle Data Provider for .NET」を選択します。 「OK」をクリックします。

 

4.

Add Connectionダイアログ・ボックスで、Connection Detailsタブが選択されていることを確認します。 Data Sourceドロップダウン・リストから、使用しているOracleデータベース・インスタンスのSIDを選択します。

ユーザー名にSYS、パスワードにoracleと入力して、ドロップダウン・リストから「SYSDBA」ロールを選択します。 「OK」をクリックして接続します。

注:sysのパスワードはoracleではない場合があります。 データベース管理者にsysのパスワードを確認してください。

 

5.

同様に、HRスキーマの接続を作成します。 Server Explorerで「Data Connections」を右クリックして、「Add Connection」を選択します。

Add Connectionダイアログ・ボックスでは、適切なデータソースとデータソース・プロバイダがすでに選択されています。

Connection Detailsタブで、ユーザー名にHR、パスワードにhrと入力します。 「OK」をクリックします。

注:HRスキーマのパスワードはhrではないことがあります。 データベース管理者にHRスキーマのパスワードを確認してください。

Server Explorerに2つの接続が表示されます。

 

6.

Server Explorerで「SYS.ORCL」接続ノードを右クリックして、「Query Window」を選択します。 問合せウィンドウが開きます。

 

7.

問合せウィンドウで、次のgrant文を入力します。

grant change notification to hr

Execute Query」ボタンをクリックします。

問合せ出力ウィンドウに完了メッセージが表示されます。 Query Editorを閉じます。

 

変更通知のVisual Studioソリューションは、ユーザーがロードおよび実行できるように事前に作成されています。

このプログラムは、HRスキーマ内のEMPLOYEES表からEMPLOYEE_IDの値が200未満のすべてのレコードを選択し、結果をADO.NETデータセットに設定します。 データセットはデータベース・サーバーへの接続を維持しないので、データベース・リソースを使用し続けることはなく、スケーラビリティが向上します。

SELECT文を実行する前に、OracleDependencyオブジェクトがOracleCommandにバインドされます。 SELECT文を実行すると、このOracleDependencyによって、データベース・サーバーに通知登録が作成されます。

もとのデータセットが切断されていても、別のユーザーがEMPLOYEES表を変更した場合、ソース・データに変更が加えられたことが通知ハンドラによって.NETアプリケーションに通知されます。 この際、クライアント側ではイベント・ハンドラが起動し、データセットの結果がリフレッシュされます。

1.

Visual StudioのFileメニューから「Open」→「Project/Solution」を選択します。 Open projectダイアログ・ボックスで、"Change Notification.zip"ファイルを抽出したフォルダに移動して、「DB Change Notification」ソリューション・ファイルを選択します。 「Open」をクリックします。

 

2.

Viewメニューから「Solution Explorer」を選択します。 Solution Explorerで、「Form1.cs」を右クリックして「View Code」を選択します。

Form1.csコード・ウィンドウが開きます。

 

3.

Oracleに接続するために接続文字列の属性を変更する必要がある場合があります。 使用しているデータソースが、サービス名がorclまたはネット・サービス名がorclに設定されている単一のローカル・インスタンスの場合は、データソース接続文字列の属性を変更する必要はありません。

別のデータソース・エイリアスを使用する必要がある場合は、接続文字列変数のデータソース値"constr"を変更します。

注:HRスキーマに接続するので、ユーザーIDがHRに設定されており、パスワードの設定が正しいことを確認します。 例のコードでは、HRのパスワードは"hr"です。 使用しているHRスキーマのパスワードが"hr"ではない場合は、DBAに正しいパスワードを確認してください。

 

4.

それぞれのコメントの下に次のコードを追加します。 コメントでは、コードの各行の機能を説明します。

cmd.AddRowid = true;
OracleDependency dep = new OracleDependency(cmd);
cmd.Notification.IsNotifiedOnce = false;
dep.OnChange += new OnChangeEventHandler(OnMyNotificaton);

 

5.

Visual StudioのDebugメニューから、「Start Debugging」を選択します。 デモが実行されます。 ブレーク・ポイントにヒットしたら、[F5]を押し、HR.EMPLOYEES表の値を含むグリッドが表示されるまで実行を続けます。

注: このプログラムを初めて実行するときには、下のスクリーンショットに示されているような、Windowsファイアウォールからのメッセージが表示される場合があります。 「Unblock」をクリックして、変更通知がデータベース・サーバーからクライアントに送信されるようにします。

デモの実行は終了しないでください。

トピック・リストに戻る

変更通知アプリケーションを実行している状態なので、HR.EMPLOYEES表のデータに変更が加えられた場合に通知を受け取ることができます。 EMPLOYEES表のデータを変更します。

1.

Server Explorerで横にある(+)プラス記号をクリックし、「HR.ORCL」を開きます。 次に、「Tables」ノードを開きます。

EMPLOYEES表を右クリックして、「Retrieve Data...」を選択し、そのデータをVisual Studioに表示します。

Microsoft Visual Studioダイアログ・ボックスに、100に設定されている最大行数よりも多くの行を取得するかどうかを尋ねるメッセージが表示された場合は、「Yes」をクリックします。

ウィンドウが開いて、従業員表のデータが表示されます。

 

2.

Visual Studioで新たに開いたデータ・ウィンドウ(変更通知アプリケーション・グリッド内ではありません)で、SALARY値の1つを変更します。 「Save」をクリックすると、値がOracleデータベースにコミットされます。

 

3.

数秒すると、変更通知アプリケーションによって、Notification Alertウィンドウが開き、結果セットが変更されたことが示されます。

注:このウィンドウが表示されない場合は、デスクトップ下部にあるタスクバーを確認してください。 タスクバーは非表示になっている場合があります。 (このウィンドウが表示される前にブレーク・ポイントにヒットした場合は、[F5]を押して続行します。)

OK」をクリックします。 Oracle Database Change Notificationのデモを閉じます。

トピック・リストに戻る

現時点では、アプリケーションは変更通知コールバックを受け取っていますが、イベント・ハンドラには前のセクションで見たダイアログ・ボックス以外は何も含まれていません。 コードを追加して、データベースに接続し、変更された行をフェッチします。

単一表のSELECTの場合、変更通知コールバックからは、その表内の変更されたすべての行に対するROWID情報が返されます。 ROWIDはもとの問合せに追加されるため、変更された行だけを取得でき、データセット全体を取得するより有利です。 その後、新しいデータだけを使用してデータセットをリフレッシュします。

1.

Form1.cs」タブをクリックします。 ドロップダウン・ボックスで、「OnMyNotificaton(.. 」を選択します。

これで、OnMyNotificatonコールバック・ルーチンに入ります。

 

2.

それぞれのコメントの下に次の一連のコードを追加します。 コメントでは、コードの各行の機能を説明します。

次の一連のコードは、変更された行だけを取得するために、基本の問合せにROWIDを追加します。

DataRow detailRow = args.Details.Rows[0];
string rowid = detailRow["Rowid"].ToString();
string sqlUpdate = sqlSelect + "where rowid = \'"+ rowid +"\'";
ほかにも更新された行が存在する場合は、次のコードをsqlUpdate文に追加します。
for (int i = 1; i < args.Details.Rows.Count; i++)
{
detailRow = args.Details.Rows[i];
rowid = detailRow["Rowid"].ToString();
sqlUpdate = sqlUpdate + " or rowid = \'"+ rowid +"\'";
}

 

3.

次の一連のコードを追加して、データをリフレッシュします。

OracleConnection con2 = new OracleConnection(constr);
OracleCommand cmd2 = new OracleCommand(sqlUpdate,con2);
con2.Open();
OracleDataAdapter da2 = new OracleDataAdapter(cmd2);
da2.Fill(ds, tablename);


4.

Buildメニューから、「Build Solution」を選択します。

エラーや警告がないことを確認します。


5.

Debugメニューから、「Start Debugging」を選択します。 HR.EMPLOYEES表の値を含んでいる グリッドが表示されます。


6.

これで、データベース内の複数の行を変更し、ODP.NETが変更された行だけを更新することを確認できます。

Solution Explorerで、「multiple_row_change.sql」をダブルクリックします。

 

7.

multiple_row_change.sqlから次の行を選択します。 [CTRL]+[C]を押して、コードをコピーします。

update employees set salary=salary+10 where employee_id=100 or employee_id=101;
commit;
    


Server Explorerで、「HR.ORCL」を右クリックして、「Query Window」を選択します。 問合せウィンドウで、コードを貼り付け、両方の文が選択されていることを確認します。 「Execute Query」をクリックして、問合せを実行します。

 

8.

Notification Alertが表示されます。 「OK」をクリックします。

アプリケーション・グリッドで、変更された行がリフレッシュされたことを確認します。

注:Oracleデータベースは、各行のROWIDで変更された行を識別します。 OracleNotificationEventArgsインスタンスは、ROWID情報をODP.NETに返します。表全体ではなく、変更された行だけが取得されます。 これにより、まだ有効なデータがリフレッシュされないようアプリケーションを保護します。

また、データベースのそれぞれの異なる変更に対して1つの通知が送られます。 2つの行が変更されたとしても、変更は1つの個別イベントとして発生します。 そのため、送信される通知は1つのみです。

Oracle Database Change Notificationデモ・ウィンドウを閉じます。

トピック・リストに戻る

Oracle Database 11g以降、ODP.NETは、そのデータベースへの問合せを登録し、オブジェクト変更通知または結果セット変更通知を受け取れるようになりました。

オブジェクト変更通知は、問合せに関連づけられたオブジェクト(表など)へのDMLまたはDDLによる変更によって作成されます。 結果セット変更通知(デフォルト)は、問合せに関連づけられた特定の結果セット行へのDMLまたはDDLによる変更によって作成されます。

結果セット変更通知は、選択した特定の結果セットにのみ焦点を合わせることで、クライアント・アプリケーションに対してより詳細な情報を提供しますが、オブジェクト変更通知ハンドラは、より負荷が軽くなっています。

注:チュートリアルのこの部分は、ODP.NET 11gおよびOracle Database 11gを使用している場合のみ実行できます。

1.

Visual Studioメニューから、「Debug」→「Start Debugging」を選択します。 Oracle Database Change Notificationデモ・ウィンドウに、従業員レコードが表示されます。

ここで、データベース内の複数の行を変更します。 ODP.NETは、変更された行だけを更新します。

まだ開いていない場合は、Solution Explorerから「multiple_row_change.sql」を開きます。


2.

multiple_row_change.sqlから次の行を選択します。 [CTRL]+[C]を押して、コードをコピーします。

Update employees set salary=salary+10 where employee_id=200 or employee_id=201;
commit;

Server Explorerで、「HR.ORCL」を右クリックして、「Query Window」を選択します。 問合せウィンドウで、コードを貼り付け、両方の文が選択されていることを確認します。 「Execute Query」をクリックして、問合せを実行します。

実行しても、Notification Alertウィンドウは表示されません

このupdate文はもとの問合せの対象外にある行に作用するので、データベース通知ハンドラは何のアクションも起こさないためです。


トピック・リストに戻る

このチュートリアルで学習した内容は、次のとおりです。

HRへの変更通知権限の付与
変更通知デモ・アプリケーションのロードと実行
Employees表の変更および変更通知イベントの発生の確認
変更通知イベントを処理するためのコールバック・ルーチンの追加
結果セット変更通知の使用

トピック・リストに戻る

 

このアイコンの上にカーソルを置くと、すべてのスクリーンショットが非表示になります。