Обнаружение изменений с использованием SqlDependency

Объект SqlDependency может быть связан с SqlCommand для определения отличия результатов запроса от изначально полученных. Вы также можете назначить делегата событию OnChange, которое сработает при изменении результатов для связанной команды. Объект SqlDependency необходимо связать с командой перед ее выполнением. Свойство HasChanges объекта SqlDependency также можно использовать для определения изменений результатов запроса с момента первого извлечения данных.

Соображения безопасности

Инфраструктура зависимостей зависит от объекта SqlConnection, открытого при вызове Start, для получения уведомлений об изменении базовых данных для данной команды. Возможность для клиента инициировать вызов SqlDependency.Start контролируется с помощью SqlClientPermission и атрибутов управления доступом для кода. Дополнительные сведения см. в разделе "Включение уведомлений о запросах " и "Безопасность доступа к коду" и ADO.NET.

Пример

Ниже приведены шаги для объявления зависимости, выполнения команды и получения уведомления при изменении результирующего набора:

  1. Создает соединение SqlDependency с сервером.

  2. Создайте объекты SqlConnection и SqlCommand для подключения к серверу и определения инструкции Transact-SQL.

  3. Создайте новый объект SqlDependency или используйте имеющийся, привязав его к объекту SqlCommand. На внутреннем уровне будет создан объект SqlNotificationRequest, который при необходимости может быть привязан к объекту команды. Данный запрос на уведомление содержит внутренний идентификатор, который однозначно идентифицирует этот объект SqlDependency. Он также запускает прослушиватель клиента, если он еще не активен.

  4. Добавьте для обработчика события подписку на событие OnChange объекта SqlDependency.

  5. Выполните команду, используя любой из методов Execute объекта SqlCommand. Так как команда связана с объектом уведомления, сервер распознает, что он должен сгенерировать уведомление, и информация об очереди будет указывать на очередь зависимостей.

  6. Остановите подключение объекта 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 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);
}

См. также