SqlDependency を使用した変更の検出

ADO.NET のダウンロード

SqlDependency オブジェクトを SqlCommand に関連付けると、クエリの結果と最初に取得した結果が異なるケースを検出できます。 OnChange イベントにデリゲートを割り当てることもできます。これは、関連付けられたコマンドの結果が変更されたときに実行されます。 コマンドを実行する前に、SqlDependency をコマンドに関連付けます。 また、HasChangesSqlDependency プロパティを使用しても、データが最初に取得されて以降にクエリ結果が変化したかどうかを判別できます。

セキュリティに関する考慮事項

依存関係インフラストラクチャは、SqlConnection に依存します。これは、Start が呼び出され、基になるデータが特定のコマンドで変更されたことを示す通知を受け取ると開きます。 クライアントによって SqlDependency.Start への呼び出しを開始する機能は、SqlClientPermission とコード アクセス セキュリティ属性を使用して制御されます。 詳しくは、「クエリ通知の有効化」をご覧ください。

次の手順では、依存関係を宣言し、コマンドを実行し、結果セットが変更されたときに通知を受け取る方法について説明します。

  1. サーバーへの SqlDependency 接続を開始します。

  2. サーバーに接続して Transact-SQL ステートメントを定義するための SqlConnection および SqlCommand オブジェクトを作成します。

  3. 新しい SqlDependency オブジェクトを作成するか、既存のオブジェクトを使用して、それを SqlCommand オブジェクトにバインドします。 内部では、この関連付けにより SqlNotificationRequest オブジェクトが作成され、必要に応じてコマンド オブジェクトにバインドされます。 この通知要求には、この SqlDependency オブジェクトを一意に識別する内部識別子が含まれます。 また、これにより、まだアクティブになっていないクライアント リスナーが起動します。

  4. イベント ハンドラーを SqlDependency オブジェクトの OnChange イベントにサブスクライブします。

  5. SqlCommand オブジェクトの任意の Execute メソッドを使用して、コマンドを実行します。 コマンドは通知オブジェクトにバインドされているため、サーバーで通知を生成する必要があることが認識され、キュー情報が依存関係キューを指します。

  6. サーバーへの SqlDependency 接続を停止します。

その後、基になるデータをユーザーが変更した場合は、Microsoft SQL Server によって、その変更に関する保留中の通知が検出されます。また、通知の投稿が行われますが、この通知は、SqlDependency.Start を呼び出して作成された、基になる SqlConnection を経由して、処理され、クライアントへ転送されるものです。 クライアント リスナーで、無効化メッセージが受信されます。 次にクライアント リスナーで、関連付けられている SqlDependency オブジェクトが検索され、OnChange イベントが起動されます。

次のコード フラグメントに、サンプル アプリケーションの作成に利用されるデザイン パターンを示します。

void Initialization()
{
    // Create a dependency connection.
    SqlDependency.Start(connectionString, queueName);
}

void SomeMethod()
{
    // Assume connection is an open SqlConnection.

    // Create a new SqlCommand object.
    using (SqlCommand command=new SqlCommand(
        "SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers",
        connection))
    {

        // Create a dependency and associate it with the SqlCommand.
        SqlDependency dependency=new SqlDependency(command);
        // Maintain the reference in a class member.

        // Subscribe to the SqlDependency event.
        dependency.OnChange+=new
           OnChangeEventHandler(OnDependencyChange);

        // Execute the command.
        using (SqlDataReader reader = command.ExecuteReader())
        {
            // Process the DataReader.
        }
    }
}

// Handler method
void OnDependencyChange(object sender,
   SqlNotificationEventArgs e )
{
  // Handle the event (for example, invalidate this cache entry).
}

void Termination()
{
    // Release the dependency.
    SqlDependency.Stop(connectionString, queueName);
}

次のステップ