Langue

Détection des modifications avec SqlDependency

Pour détecter quand les résultats de la requête diffèrent de ceux récupérés à l’origine, associez l’objet SqlDependency avec SqlCommand avant d’exécuter la commande. Abonnez-vous à l’événement OnChange pour recevoir une notification lorsque les résultats changent. Vous pouvez également vérifier la propriété HasChanges de la dépendance pour déterminer si les résultats ont changé.

Considérations relatives à la sécurité

Pour recevoir des notifications lorsque les données sous-jacentes changent, appelez Start. L’infrastructure de dépendance ouvre le SqlConnection pour l’écouteur. Accordez au principal de la base de données les autorisations de notification Service Broker et de requête requises. La sécurité de l'accès au code n'est pas prise en charge dans les .NET modernes. Pour plus d’informations, consultez Activation des notifications de requête.

Exemple

Les étapes suivantes montrent comment déclarer une dépendance, exécuter une commande et recevoir une notification lorsque le jeu de résultats change :

  1. Lors de l’initialisation de l’application, appelez SqlDependency.Start pour démarrer l’écouteur client.

  2. Créez des objets SqlCommand et SqlConnection pour vous connecter au serveur et définissez une instruction Transact-SQL (T-SQL).

  3. Créez ou réutilisez l’objet SqlDependency et associez-le à l’objet SqlCommand . La dépendance crée et associe l’objet SqlNotificationRequest à la commande en fonction des besoins. La demande de notification contient un identificateur interne pour la dépendance. Le constructeur ne démarre pas l’écouteur.

  4. Abonnez un gestionnaire d’événements à l’événement OnChange de l’objet SqlDependency.

  5. Exécutez la commande avec l’une de ces méthodes Execute. Étant donné que la commande inclut une demande de notification, le serveur inscrit la requête pour les notifications dans la file d’attente spécifiée.

  6. À l’arrêt de l’application, appelez SqlDependency.Stop avec le même chaîne de connexion et le même nom de file d’attente.

Si un utilisateur modifie ensuite les données sous-jacentes, Microsoft SQL Server détecte qu’il existe une notification en attente pour une telle modification, puis publie une notification qui est traitée et transférée au client via la SqlConnection sous-jacente qui a été créée en appelant SqlDependency.Start. L’écouteur client reçoit le message d’invalidation. L’écouteur client localise ensuite l’objet SqlDependency associé et déclenche l’événement OnChange.

Le fragment de code suivant montre le modèle de conception d’une application exemple. Installez le package NuGet Microsoft.Data.SqlClient et importez Microsoft.Data.SqlClient en C# ou Visual Basic.

Ces fragments utilisent une file d’attente Service Broker existante. Définissez queueName sur le nom non qualifié de la file d’attente et notificationOptions sur service=<service-name>;local database=<database-name>. Spécifiez le service qui achemine les notifications vers cette file d’attente. Transmettez la même chaîne de connexion et le même nom de file d’attente à Start et Stop. Pour plus d’informations, consultez Activer les notifications de requête.

Sub Initialization()
    ' Create a dependency connection.
    SqlDependency.Start(connectionString, queueName)
End Sub

Sub SomeMethod()
    ' Assume connection is an open SqlConnection.
    ' Create a new SqlCommand object.
    Using command As New SqlCommand( _
      "SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers", _
      connection)

        ' Create a dependency and associate it with the SqlCommand.
        Dim dependency As New SqlDependency(command, notificationOptions, 0)
        ' Maintain the reference in a class member.
        ' Subscribe to the SqlDependency event.
        AddHandler dependency.OnChange, AddressOf OnDependencyChange

        ' Execute the command.
        Using reader = command.ExecuteReader()
            ' Process the DataReader.
        End Using
    End Using
End Sub

' Handler method
Sub OnDependencyChange(ByVal sender As Object, _
    ByVal e As SqlNotificationEventArgs)
    ' Handle the event (for example, invalidate this cache entry).
End Sub

Sub Termination()
    ' Release the dependency
    SqlDependency.Stop(connectionString, queueName)
End Sub
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, notificationOptions, 0);
        // 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);
}

Voir aussi