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


Включение уведомлений запросов

Скачать ADO.NET

Приложения, использующие уведомления о запросах, имеют общий набор требований. Чтобы поддерживать уведомления о запросах, источник данных SQL должен быть правильно настроен, а пользователь должен иметь соответствующие права доступа на стороне клиента и сервера.

Чтобы использовать уведомления о запросах, сделайте следующее.

  • Включите уведомления о запросах для своей базы данных.
  • Предоставьте идентификатору пользователя, используемому для подключения к базе данных, необходимые разрешения.
  • Используйте объект SqlCommand для выполнения допустимой инструкции SELECT со связанным объектом уведомления: SqlDependency или SqlNotificationRequest.
  • Укажите код для обработки уведомления в случае изменения отслеживаемых данных.

Требования к уведомлениям о запросах

Уведомления о запросах поддерживаются только для инструкций SELECT, которые соответствуют конкретным требованиям. В приведенной ниже таблице указаны ссылки на статьи о компоненте Service Broker и уведомлениях о запросах в электронной документации по SQL Server.

документация по SQL Server

Настройка уведомлений о запросах для выполнения примера кода

Чтобы включить компонент Service Broker для базы данных AdventureWorks с помощью среды SQL Server Management Studio, выполните следующую инструкцию Transact-SQL.

ALTER DATABASE AdventureWorks SET ENABLE_BROKER;

Для правильного запуска примеров уведомлений о запросах необходимо выполнить на сервере базы данных приведенные ниже инструкции Transact-SQL.

CREATE QUEUE ContactChangeMessages;

CREATE SERVICE ContactChangeNotifications
  ON QUEUE ContactChangeMessages
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);

Разрешения на уведомления о запросах

Пользователям, выполняющим команды для запроса уведомлений, необходимо разрешение базы данных SUBSCRIBE QUERY NOTIFICATIONS на сервере.

Код на стороне клиента, который выполняется в случае частичного доверия, требует разрешения SqlClientPermission.

Следующий код создает объект SqlClientPermission, устанавливая для PermissionState значение Unrestricted. Demand принудительно создает исключение SecurityException во время выполнения, если все вызывающие методы, расположенные выше в стеке вызовов, не получили разрешения.

using Microsoft.Data.SqlClient;
using System.Security.Permissions;

class Program
{
    static void Main()
    {
    }

    // Code requires directives to
    // System.Security.Permissions and
    // Microsoft.Data.SqlClient

    private bool CanRequestNotifications()
    {
        SqlClientPermission permission =
            new SqlClientPermission(
            PermissionState.Unrestricted);
        try
        {
            permission.Demand();
            return true;
        }
        catch (System.Exception)
        {
            return false;
        }
    }
}

Выбор объекта уведомления

API-интерфейс уведомлений о запросах предоставляет два объекта для обработки уведомлений: SqlDependency и SqlNotificationRequest.

Использование SqlDependency

Чтобы вы могли использовать объект SqlDependency, в используемой базе данных SQL Server должен быть включен компонент Service Broker, а пользователи должны иметь права для получения уведомлений. Объекты компонента Service Broker, такие как очередь уведомлений, предопределены.

Кроме того, объект SqlDependency автоматически запускает рабочий поток для обработки уведомлений по мере их помещения в очередь. Он также анализирует сообщение Service Broker, предоставляя сведения в виде данных аргумента события. Экземпляр SqlDependency создается путем вызова метода Start, который устанавливает зависимость с базой данных. Start — это статический метод, который необходимо вызывать только один раз во время инициализации приложения для каждого требуемого подключения к базе данных. Метод Stop необходимо вызывать при завершении приложения для каждого установленного подключения зависимости.

Использование SqlNotificationRequest

В то же время SqlNotificationRequest требует реализации всей инфраструктуры прослушивания вручную. Кроме того, необходимо определить все поддерживающие объекты компонента Service Broker, такие как очередь, служба и типы сообщений, поддерживаемые очередью. Этот ручной подход полезен, если для вашего приложения требуются специальные сообщения с уведомлениями или параметры уведомлений или же если ваше приложение является частью более крупного приложения Service Broker.

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