Detekce změn pomocí SqlDependency

Objekt SqlDependency lze přidružit k objektu SqlCommand , aby bylo možné zjistit, kdy se výsledky dotazu liší od původně načtených. Delegáta můžete také přiřadit k OnChange události, která se aktivuje, když se výsledky pro přidružený příkaz změní. Před spuštěním příkazu je nutné ho přidružit SqlDependency k příkazu. HasChanges Vlastnost objektu SqlDependency lze také použít k určení, jestli se výsledky dotazu od prvního načtení dat změnily.

Aspekty zabezpečení

Infrastruktura závislostí spoléhá na SqlConnection to, že se Start při volání volá, aby dostávala oznámení, že se podkladová data pro daný příkaz změnila. Schopnost klienta zahájit volání SqlDependency.Start je řízena pomocí SqlClientPermission atributů zabezpečení přístupu kódu a kódu. Další informace najdete v tématu Povolení oznámení dotazů a zabezpečení přístupu kódu a ADO.NET.

Příklad

Následující kroky ukazují, jak deklarovat závislost, spustit příkaz a přijmout oznámení při změně sady výsledků:

  1. SqlDependency Zahajte připojení k serveru.

  2. Vytvořte SqlConnection a SqlCommand objekty pro připojení k serveru a definujte příkaz Jazyka Transact-SQL.

  3. Vytvořte nový SqlDependency objekt nebo použijte existující objekt a vytvořte vazbu s objektem SqlCommand . Interně se vytvoří SqlNotificationRequest objekt a podle potřeby ho sváže s objektem příkazu. Tato žádost o oznámení obsahuje interní identifikátor, který jednoznačně identifikuje tento SqlDependency objekt. Spustí se také naslouchací proces klienta, pokud ještě není aktivní.

  4. Přihlášení obslužné rutiny události k OnChange události objektu SqlDependency .

  5. Spusťte příkaz pomocí některé z Execute metod objektu SqlCommand . Vzhledem k tomu, že příkaz je vázán na objekt oznámení, server rozpozná, že musí vygenerovat oznámení a informace fronty budou odkazovat na frontu závislostí.

  6. SqlDependency Zastavte připojení k serveru.

Pokud některý uživatel následně změní podkladová data, Microsoft SQL Server zjistí, že na takovou změnu čeká oznámení, a odešle oznámení, které je zpracováno a předáno klientovi prostřednictvím podkladu SqlConnection vytvořeného voláním SqlDependency.Start. Klient naslouchací proces obdrží zprávu o zneplatnění. Klientský naslouchací proces pak vyhledá přidružený SqlDependency objekt a aktivuje OnChange událost.

Následující fragment kódu ukazuje vzor návrhu, který byste použili k vytvoření ukázkové aplikace.

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)
        ' 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);
        // 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);
}

Viz také