Condividi tramite


Utilizzo di SqlNotificationRequest per la sottoscrizione di notifiche delle query

Per sottoscrivere una notifica delle query utilizzando notificationRequest è necessario preparare gli oggetti di Service Broker sottostanti prima che l'applicazione possa richiedere la notifica. Dopo aver richiesto la sottoscrizione, l'applicazione in uso controlla l'eventuale presenza di un messaggio di notifica nella coda e all'arrivo del messaggio reagisce nel modo appropriato.

SQL Server recapita le notifiche delle query utilizzando Service Broker. Il messaggi di notifica delle query sono caratterizzati dal nome di tipo https://schemas.microsoft.com/SQL/Notifications/QueryNotification. Service Broker convalida i messaggi di questo tipo come VALID_XML WITH SCHEMA COLLECTION. Per le sottoscrizioni create con SqlNotificationRequest, l'applicazione è responsabile del monitoraggio della coda e dell'elaborazione dei messaggi di notifica. Per l'utilizzo di SqlNotificationRequest è pertanto necessaria l'implementazione di un'applicazione esterna. In questo argomento vengono illustrati gli specifici passaggi necessari per sottoscrivere una notifica delle query utilizzando SqlNotificationRequest. Per ulteriori informazioni sulla creazione di un'applicazione per l'elaborazione dei messaggi di notifica delle query, vedere Introduction to Service Broker Programming.

In SqlNotificationRequest è necessario specificare il servizio che riceverà i messaggi di notifica. Per creare un servizio è necessario creare una coda che verrà utilizzata dal servizio, quindi creare il servizio. È inoltre necessario creare una route per il servizio nel database locale.

Motore di database utilizza per l'invio dei messaggi di notifica il contratto https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification, pertanto il servizio creato deve accettare conversazioni che rispettano tale contratto. Nell'esempio seguente viene creato un servizio denominato WebCacheNotifications che utilizza la coda WebCacheMessages e successivamente viene creata una route per il servizio WebCacheNotifications nel database 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' ;

Il contratto https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification specifica che i messaggi di tipo https://schemas.microsoft.com/SQL/Notifications/QueryNotification possono essere inviati dall'initiator della conversazione.

Il nome del servizio nell'oggetto SqlNotificationRequest è il nome del servizio di Service Broker. La notifica viene creata come messaggio di Service Broker.

La richiesta di notifica deve inoltre contenere una stringa di messaggio per la richiesta. Quando Motore di database crea una notifica per questa richiesta, il messaggio di notifica contiene questa stringa di messaggio. Il messaggio di notifica è un documento XML contenente un elemento Message che include la stringa di messaggio presente nella richiesta di notifica. L'applicazione utilizza la stringa di messaggio per identificare la query che corrisponde alla notifica.

Le sottoscrizioni di notifica vengono gestite mediante una combinazione della query e del messaggio. Se l'applicazione richiede un'altra notifica con lo stesso messaggio e la stessa query, Motore di database non crea una nuova sottoscrizione di notifica, bensì aggiorna quella esistente. Il messaggio può essere costituito da qualsiasi stringa. Si noti tuttavia che Motore di database è in grado di determinare se due messaggi sono uguali. Le opzioni impostate per le stringhe di database che non vengono considerate equivalenti nel programma in uso possono pertanto essere equivalenti nel database. Ad esempio, Motore di database considera uguali le stringhe che differiscono solo nel numero di spazi vuoti finali.

Nell'esempio seguente viene illustrato un semplice programma che crea una sottoscrizione di notifica mediante 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

Dopo l'esecuzione del codice, SQL Server conterrà una sottoscrizione di notifica per una query. La sottoscrizione genera una notifica quando viene apportata una modifica nei dati specificati nella query seguente:

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

Service Broker recapita il messaggio di notifica al servizio WebCacheNotifications. Poiché questo servizio utilizza la coda WebCacheMessages, i messaggi di notifica vengono visualizzati in tale coda. Per elaborare i messaggi di notifica, l'applicazione esegue il monitoraggio della coda WebCacheMessages.

Vedere anche

Concetti

Ricezione di notifiche
Utilizzo di SqlDependency per la sottoscrizione di notifiche delle query

Altre risorse

Introduction to Service Broker Programming
Routing di Service Broker

Guida in linea e informazioni

Assistenza su SQL Server 2005