Partager via


Utilisation de SqlNotificationRequest pour s'abonner aux notifications de requêtes

Pour vous abonner à une notification de requête à l'aide de l'élément SqlNotificationRequest, vous devez préparer les objets Service Broker sous-jacents afin que l'application puisse demander la notification. Une fois que vous avez demandé l'abonnement, l'application surveille la file d'attente et réagit en conséquence dès qu'elle reçoit un message de notification.

SQL Server remet les notifications de requêtes à l'aide de Service Broker. Un message de notification de requête possède le nom de type de message https://schemas.microsoft.com/SQL/Notifications/QueryNotification. Service Broker valide les messages de ce type en tant que VALID_XML WITH SCHEMA COLLECTION. Pour les abonnements créés avec SqlNotificationRequest, l'application est responsable de la surveillance de la file d'attente et du traitement des messages de notification. Par conséquent, l'utilisation de SqlNotificationRequest requiert l'implémentation d'une application externe. Cette rubrique présente les étapes de l'abonnement à une notification de requête à l'aide de SqlNotificationRequest. Pour plus d'informations sur la création d'une application permettant de traiter les messages de notification de requête, consultez Introduction to Service Broker Programming.

Une SqlNotificationRequest doit spécifier un service pour recevoir les messages de notification. Pour créer un service, vous devez créer la file d'attente que celui-ci devra utiliser, puis le service proprement dit. Vous devez également créer un itinéraire au service dans la base de données locale.

Le Moteur de base de données utilise le contrat https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification pour envoyer les messages de notification, si bien que le service que vous créez doit accepter les conversations qui suivent ce contrat. L'exemple ci-après crée un service nommé WebCacheNotifications qui utilise la file d'attente WebCacheMessages puis crée un itinéraire vers le service WebCacheNotifications dans la base de données locale.

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

Le contrat https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification spécifie que les messages de type https://schemas.microsoft.com/SQL/Notifications/QueryNotification peuvent être envoyés par l'initiateur de la conversation.

Le nom de service dans l'objet SqlNotificationRequest est le nom du service Service Broker. La notification est créée en tant que message Service Broker.

En outre, la demande de notification doit contenir une chaîne de message. Lorsque le Moteur de base de données crée une notification pour cette demande, le message de notification contient cette chaîne de message. Le message de notification est un document XML. Ce document contient un élément Message qui comporte la chaîne de message incluse dans la demande de notification. L'application utilise la chaîne de message pour identifier la requête qui correspond à la notification.

Les abonnements aux notifications sont gérés à l'aide d'une combinaison de la requête et du message. Si l'application demande une autre notification avec le même message et la même requête, le Moteur de base de données met à jour l'abonnement aux notifications au lieu de créer un nouvel abonnement. Le message peut être n'importe quelle chaîne. Toutefois, le Moteur de base de données détermine si deux messages sont les mêmes. Par conséquent, si les options définies pour les chaînes de base de données n'apparaissent pas équivalentes dans votre programme, elles peuvent l'être dans la base de données. Par exemple, le Moteur de base de données considère identiques les chaînes qui ne diffèrent que par le nombre d'espaces de fin.

L'exemple ci-après montre un programme simple qui crée un abonnement aux notifications à l'aide de 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

Une fois ce code exécuté, SQL Server contient un abonnement aux notifications de requêtes. L'abonnement génère une notification en cas de modification d'une des données spécifiées dans la requête suivante :

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

Service Broker remet les messages de notification au service WebCacheNotifications. Étant donné que ce service utilise la file d'attente WebCacheMessages, les messages de notification apparaissent dans celle-ci. Pour traiter les messages de notification, l'application surveille la file d'attente WebCacheMessages.

Voir aussi

Concepts

Réception de notifications
Utilisation de SqlDependency pour s'abonner à des notifications de requêtes

Autres ressources

Introduction to Service Broker Programming
Routage Service Broker

Aide et Informations

Assistance sur SQL Server 2005