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ů:
SqlDependency
Zahajte připojení k serveru.Vytvořte SqlConnection a SqlCommand objekty pro připojení k serveru a definujte příkaz Jazyka Transact-SQL.
Vytvořte nový
SqlDependency
objekt nebo použijte existující objekt a vytvořte vazbu s objektemSqlCommand
. 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 tentoSqlDependency
objekt. Spustí se také naslouchací proces klienta, pokud ještě není aktivní.Přihlášení obslužné rutiny události k
OnChange
události objektuSqlDependency
.Spusťte příkaz pomocí některé z
Execute
metod objektuSqlCommand
. 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í.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);
}