SqlDependency を使用した変更の検出
SqlDependency オブジェクトを SqlCommand に関連付けると、クエリの結果と最初に取得した結果が異なるケースを検出できます。 OnChange
イベントにデリゲートを割り当てることもできます。これは、関連付けられたコマンドの結果が変更されたときに実行されます。 コマンドを実行する前に、SqlDependency をコマンドに関連付けます。 また、HasChanges
の SqlDependency プロパティを使用しても、データが最初に取得されて以降にクエリ結果が変化したかどうかを判別できます。
セキュリティに関する考慮事項
依存関係インフラストラクチャは、SqlConnection に依存します。これは、Start が呼び出され、基になるデータが特定のコマンドで変更されたことを示す通知を受け取ると開きます。 クライアントによって SqlDependency.Start
への呼び出しを開始する機能は、SqlClientPermission とコード アクセス セキュリティ属性を使用して制御されます。 詳しくは、「クエリ通知の有効化」をご覧ください。
例
次の手順では、依存関係を宣言し、コマンドを実行し、結果セットが変更されたときに通知を受け取る方法について説明します。
サーバーへの
SqlDependency
接続を開始します。サーバーに接続して Transact-SQL ステートメントを定義するための SqlConnection および SqlCommand オブジェクトを作成します。
新しい
SqlDependency
オブジェクトを作成するか、既存のオブジェクトを使用して、それをSqlCommand
オブジェクトにバインドします。 内部では、この関連付けにより SqlNotificationRequest オブジェクトが作成され、必要に応じてコマンド オブジェクトにバインドされます。 この通知要求には、このSqlDependency
オブジェクトを一意に識別する内部識別子が含まれます。 また、これにより、まだアクティブになっていないクライアント リスナーが起動します。イベント ハンドラーを
SqlDependency
オブジェクトのOnChange
イベントにサブスクライブします。SqlCommand
オブジェクトの任意のExecute
メソッドを使用して、コマンドを実行します。 コマンドは通知オブジェクトにバインドされているため、サーバーで通知を生成する必要があることが認識され、キュー情報が依存関係キューを指します。サーバーへの
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);
}
次のステップ
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示