Verwenden von SqlNotificationRequest zum Abonnieren von Abfragebenachrichtigungen

Für ein Abonnement einer Abfragebenachrichtigung mithilfe von SqlNotificationRequest müssen Sie zunächst die zugrunde liegenden Service Broker-Objekte vorbereiten, bevor Ihre Anwendung die Benachrichtigung anfordern kann. Nachdem Sie das Abonnement angefordert haben, überwacht Ihre Anwendung die Warteschlange und reagiert entsprechend, sobald eine Benachrichtigungsmeldung eintrifft.

SQL Server übermittelt Abfragebenachrichtigungen mithilfe von Service Broker. Eine Abfragebenachrichtigungsmeldung besitzt den Meldungstypnamen https://schemas.microsoft.com/SQL/Notifications/QueryNotification. Service Broker überprüft Meldungen dieses Typs als VALID_XML WITH SCHEMA COLLECTION. Bei mit SqlNotificationRequest erstellten Abonnements ist die Anwendung für die Überwachung der Warteschlange und die Verarbeitung der Benachrichtigungsmeldungen verantwortlich. Daher ist beim Verwenden von SqlNotificationRequest erforderlich, dass Sie eine externe Anwendung implementieren. In diesem Thema werden die einzelnen Schritte erläutert, die zum Abonnieren einer Abfragebenachrichtigung mithilfe von SqlNotificationRequest erforderlich sind. Weitere Informationen zum Erstellen einer Anwendung für die Verarbeitung von Abfragebenachrichtigungsmeldungen finden Sie unter Vorteile der Programmierung mit Service Broker.

SqlNotificationRequest muss einen Dienst angeben, der die Benachrichtigungsmeldungen erhalten soll. Zum Erstellen des Diensts müssen Sie zunächst die von dem Dienst zu verwendende Warteschlange und anschließend den Dienst selbst erstellen. Außerdem müssen Sie eine Route zu dem Dienst in der lokalen Datenbank erstellen.

Database Engine (Datenbankmodul) verwendet den Dienstvertrag unter https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification, um Benachrichtigungsmeldungen zu senden. Daher muss der von Ihnen erstellte Dienst diesem Vertrag entsprechende Konversationen akzeptieren. Das folgende Beispiel erstellt einen Dienst namens WebCacheNotifications, der die Warteschlange WebCacheMessages verwendet und dann eine Route zum WebCacheNotifications-Dienst in der lokalen Datenbank erstellt.

USE AdventureWorks2008R2 ;

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' ;

Der Vertrag https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification gibt an, dass vom Initiator der Konversation Benachrichtigungsmeldungen vom Typ https://schemas.microsoft.com/SQL/Notifications/QueryNotification gesendet werden können.

Der Name des Diensts in dem SqlNotificationRequest-Objekt ist der Name des Service Broker-Diensts. Die Benachrichtigung wird als Service Broker-Nachricht erstellt.

Die Benachrichtigungsanforderung muss außerdem eine Meldungszeichenfolge für die Anforderung enthalten. Wenn Database Engine (Datenbankmodul) die Benachrichtigung für diese Anforderung erstellt, enthält die Benachrichtigungsmeldung diese Meldungszeichenfolge. Die Benachrichtigungsmeldung ist ein XML-Dokument. Dieses Dokument enthält ein Message-Element mit der in der Benachrichtigungsanforderung enthaltenen Meldungszeichenfolge. Die Anwendung verwendet die Meldungszeichenfolge zum Identifizieren der Abfrage, die der Benachrichtigung entspricht.

Benachrichtigungsabonnements werden mithilfe einer Kombination aus der Abfrage und der Benachrichtigungsmeldung verwaltet. Wenn die Anwendung eine weitere Benachrichtigung mit derselben Meldung und derselben Abfrage anfordert, aktualisiert Database Engine (Datenbankmodul) die Benachrichtigung, d. h., es wird kein neues Abonnement erstellt. Die Meldung kann aus einer beliebigen Zeichenfolge bestehen. Beachten Sie jedoch, dass Database Engine (Datenbankmodul) bestimmt, ob zwei Meldungen identisch sind. Daher kann es vorkommen, dass aufgrund der festgelegten Optionen Datenbankzeichenfolgen in Ihrem Programm als unterschiedlich erkannt, in der Datenbank jedoch als äquivalent behandelt werden. Beispielsweise werden in Database Engine (Datenbankmodul) Zeichenfolgen mit einer unterschiedlichen Anzahl nachfolgender Leerzeichen als identisch betrachtet.

Das folgende Beispiel zeigt ein einfaches Programm, das mithilfe von SqlNotificationRequest ein Benachrichtigungsabonnement erstellt:

[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 AdventureWorks2008R2 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=AdventureWorks2008R2;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

Nachdem dieser Code ausgeführt wurde, enthält SQL Server ein Abonnement für eine Abfragebenachrichtigung. Das Abonnement erstellt eine Benachrichtigung, wenn eine Änderung der in der folgenden Abfrage angegebenen Daten erfolgt:

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

Service Broker übermittelt die Benachrichtigungsmeldungen an den WebCacheNotifications-Dienst. Dieser Dienst verwendet die WebCacheMessages-Warteschlange. Daher werden die Benachrichtigungsmeldungen nun in diese Warteschlange gestellt. Die Anwendung überwacht die WebCacheMessages-Warteschlange, um die Benachrichtigungsmeldungen zu verarbeiten.