Выявление изменений с помощью SqlDependency (ADO.NET)
Объект SqlDependency может быть связан с командой SqlCommand, чтобы определить, отличаются ли результаты запроса от исходных полученных результатов.Можно также назначить делегата событию OnChange, которое инициируется, когда для связанной команды изменяются результаты.SqlDependency необходимо связать с командой перед выполнением команды.Свойство HasChanges зависимости SqlDependency может также использоваться для определения, изменились ли результаты запроса после первого получения данных.
Вопросы безопасности
Инфраструктура безопасности основана на соединении SqlConnection, которое открывается при вызове Start, чтобы получать уведомления о том, что базовые данные изменились для данной команды.Возможность для клиента инициировать вызов SqlDependency.Start регулируется использованием SqlClientPermission и атрибутами управления доступом для кода.Дополнительные сведения см. в разделах Включение уведомлений о запросах (ADO.NET) и Управление доступом для кода и ADO.NET.
Пример
Следующие шаги иллюстрируют, как объявить о зависимости, выполнить команду и получить уведомление, когда изменяется результирующий набор.
Инициирование соединения SqlDependency с сервером.
Создание объектов SqlConnection и SqlCommand для подключения к серверу и определения инструкции Transact-SQL.
Создание нового объекта SqlDependency или использование существующего объекта, привязывание его к объекту SqlCommand.Внутренне это создает объект SqlNotificationRequest, и выполняется его привязка к объекту команды, как необходимо.Запрос уведомления содержит внутренний идентификатор, который однозначно идентифицирует этот объект SqlDependency.Он также запускает прослушивателя клиента, если он еще не активен.
Подписка обработчика событий на событие OnChange объекта SqlDependency.
Выполнение команды с использованием любого метода Execute объекта SqlCommand.Так как команда привязана к объекту уведомления, сервер распознает, что она должна сформировать уведомление, и данные об очередях будут указывать на очередь зависимостей.
Остановка соединения SqlDependency с сервером.
Если какой-либо пользователь изменяет базовые данные, Microsoft SQL Server обнаруживает, что имеется уведомление, ожидающее это изменение, и формирует уведомление, которое обрабатывается и перенаправляется клиенту по базовому соединению SqlConnection, созданному вызовом SqlDependency.Start.Прослушиватель клиента получает сообщение о недействительности.Прослушиватель клиента находит связанный объект SqlDependency и инициирует событие OnChange.
В следующем фрагменте кода показан шаблон конструирования, который используется для создания примера приложения.
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 refence 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 refence 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);
}