次の方法で共有


SqlNotificationRequest の使用によるクエリ通知のサブスクライブ

SqlNotificationRequest を使用してクエリ通知をサブスクライブするには、アプリケーションが通知を要求する前に、基になる Service Broker オブジェクトを用意しておく必要があります。サブスクリプションを要求すると、アプリケーションはキューの監視を開始し、通知メッセージがキューに配信されると適切な処理を行います。

SQL Server は、Service Broker を使用してクエリ通知を配信します。クエリ通知メッセージには、https://schemas.microsoft.com/SQL/Notifications/QueryNotification というメッセージ型名があります。Service Broker は、この型のメッセージを VALID_XML WITH SCHEMA COLLECTION として検証します。SqlNotificationRequest を使用して作成されたサブスクリプションの場合、キューの監視と通知メッセージの処理はアプリケーションが行います。したがって、SqlNotificationRequest を使用する場合は、外部アプリケーションを実装する必要があります。このトピックでは、SqlNotificationRequest 使用したクエリ通知のサブスクライブに必要な手順について説明します。クエリ通知メッセージを処理するアプリケーションの作成の詳細については、「Service Broker のプログラミングの概要」を参照してください。

SqlNotificationRequest には、通知メッセージを受け取るサービスを指定する必要があります。サービスを作成するには、まずサービスが使用するキューを作成し、その後サービスを作成します。また、ローカル データベースのサービスへのルートも作成する必要があります。

データベース エンジン は、コントラクト https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification を使用して通知メッセージを送信するので、作成するサービスはこのコントラクトに従ったメッセージ交換を受け入れる必要があります。次の例では、WebCacheMessages というキューを使用する WebCacheNotifications という名前のサービスを作成し、ローカル データベースに WebCacheNotifications サービスへのルートを作成します。

USE AdventureWorks ;

CREATE QUEUE WebSiteCacheMessages ;

CREATE SERVICE WebCacheNotifications
  ON QUEUE WebSiteCacheMessages
  ([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]) ;

CREATE ROUTE
  WebCacheMessagesRoute
  WITH SERVICE_NAME = 'WebCacheNotifications',
       ADDRESS = 'LOCAL' ;

コントラクト https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification は、メッセージ交換の発信側が https://schemas.microsoft.com/SQL/Notifications/QueryNotification 型のメッセージを送信できることを指定しています。

SqlNotificationRequest オブジェクト内のサービス名は、Service Broker サービスの名前です。通知は、Service Broker メッセージとして作成されます。

また、通知要求にも、要求のメッセージ文字列を設定する必要があります。データベース エンジン がこの要求の通知を作成する場合、通知メッセージにはこのメッセージ文字列が使われます。通知メッセージは XML ドキュメントです。このドキュメントには、通知要求に含まれていたメッセージ文字列を格納する Message 要素が含まれています。アプリケーションは、このメッセージ文字列を使用して、通知に該当するクエリを特定します。

通知のサブスクリプションは、クエリと通知メッセージを組み合わせて使用することで実現されます。アプリケーションが、同じメッセージと同じクエリを使って別の通知を要求した場合、データベース エンジン は新しいサブスクリプションを作成するのではなく、元の通知サブスクリプションを更新します。メッセージには、任意の文字列を使用できます。ただし、データベース エンジン が 2 つのメッセージを同じものであるかどうかを判断することに注意してください。したがって、データベース文字列のうち、プログラムで等しいことが比較されないオプション セットは、そのデータベース内では同じものとして扱われる可能性があります。たとえば、データベース エンジン は、末尾の空白の数のみが異なる文字列は、同じ文字列であると見なします。

次の例は、SqlNotificationRequest を使用して通知サブスクリプションを作成する簡単なプログラムです。

[Visual Basic]

Option Strict On

Imports System
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlClient


Namespace Microsoft.Samples.SqlServer

Module NotificationSampleMain


    Public Sub Main()

        Try

            ' Connect to the AdventureWorks database in the default instance
            ' on this server, using integrated security.  If you change this
            ' connection string, be sure to change the service string below.

            Using connection As SqlConnection = _
                new SqlConnection("database=AdventureWorks;server=.;" + _
                                  "Integrated Security=SSPI")

                connection.Open()

                ' Define the service to receive the notifications. Update this
                ' information if you change the connection string.

                Dim service As String = _
                    "WebCacheNotifications"

                Dim query As String = _
                        "SELECT prod.Name, prod.Class, " + _
                        "       prod.ProductNumber " + _
                        "FROM Production.Product as prod " + _
                        "WHERE prod.Color = 'Black' " 

                Dim command As SqlCommand = connection.CreateCommand()

                command.CommandText = query

                command.Notification = _
                    new SqlNotificationRequest(Guid.NewGuid().ToString(), _
                                               service, _
                                               Int32.MaxValue)

               Dim reader As SqlDataReader = command.ExecuteReader()

               ' Normally, an application would process the results here.

               MsgBox("Registered the notification.")
                  
            ' Notice that the connection dispose method also
            ' disposes the commands and readers created from the
            ' connection.

            End Using  ' Using connection

            

        ' For sample purposes, simply display all exceptions and exit.

        Catch e As SqlException
               MsgBox("SqlException: " + e.Message + vbCrLf  _
                                       + e.StackTrace )
        Catch e As Exception
               MsgBox("Exception: " + e.Message + vbCrLf  _
                                       + e.StackTrace )
        End Try

    End Sub ' Main

End Module 'NotificationSampleMain

End Namespace ' Microsoft.Samples.SqlServer

このコードを実行すると、SQL Server にクエリ通知サブスクリプションが登録されます。このサブスクリプションは、次のクエリに指定されたデータのいずれかが変更されると、通知を生成します。

SELECT prod.Name, prod.Class, prod.ProductNumber
FROM Products.Product as prod
    WHERE prod.Color = 'Black'

Service Broker は、通知メッセージを WebCacheNotifications サービスに配信します。このサービスはキュー WebCacheMessages を使用するので、通知メッセージはこのキューに登録されます。アプリケーションは通知メッセージを処理するために、キュー WebCacheMessages を監視します。

参照

概念

通知の取得
SqlDependency を使用したクエリ通知のサブスクライブ

その他の技術情報

Service Broker のプログラミングの概要
Service Broker のルーティング

ヘルプおよび情報

SQL Server 2005 の参考資料の入手