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, který se otevře, když je volán Start, aby přijímal oznámení o změně podkladových dat pro daný příkaz. Možnost klienta zahájit volání na SqlDependency.Start je řízena pomocí atributů SqlClientPermission a zabezpečení přístupu 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 příkazovým objektem. Tato žádost o oznámení obsahuje interní identifikátor, který jednoznačně identifikuje tento SqlDependency objekt. Spustí se také posluchač klienta, pokud ještě není aktivní.

  4. Přiřaďte obslužnou rutinu k události OnChange objektu SqlDependency.

  5. Spusťte příkaz pomocí některé z Execute metod objektu SqlCommand . Vzhledem k tomu, že příkaz je přiřazen k objektu oznámení, server rozpozná, že musí vygenerovat oznámení a informace o frontě budou odkazovat na frontu úloh 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é