Поделиться через


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

Скачать ADO.NET

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

Вопросы безопасности

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

Пример

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

  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.

В приведенном ниже фрагменте кода показан конструктивный шаблон, который необходимо использовать для создания примера приложения.

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

Дальнейшие действия