Обнаружение изменений с использованием SqlDependency
Объект SqlDependency может быть связан с SqlCommand для определения отличия результатов запроса от изначально полученных. Вы также можете назначить делегата событию OnChange
, которое сработает при изменении результатов для связанной команды. Свяжите объект SqlDependency с командой перед ее выполнением. Свойство HasChanges
объекта SqlDependency также можно использовать для определения изменений результатов запроса с момента первого извлечения данных.
Вопросы безопасности
Инфраструктура зависимостей основана на объекте SqlConnection, открытом при вызове Start для получения уведомлений об изменении базовых данных для данной команды. С помощью SqlClientPermission и атрибутов управления доступом для кода можно управлять способностью клиента запускать вызов SqlDependency.Start
. Дополнительные сведения см. в статье Включение уведомлений запросов.
Пример
Ниже приведены шаги для объявления зависимости, выполнения команды и получения уведомления при изменении результирующего набора:
Создает соединение
SqlDependency
с сервером.Создайте объекты SqlConnection и SqlCommand для подключения к серверу и определения инструкции Transact-SQL.
Создайте новый объект
SqlDependency
или используйте имеющийся, привязав его к объектуSqlCommand
. На внутреннем уровне эта связь создает объект SqlNotificationRequest, который при необходимости может быть привязан к объекту команды. Данный запрос на уведомление содержит внутренний идентификатор, который однозначно идентифицирует этот объектSqlDependency
. Он также запускает прослушиватель клиента, если он еще не активен.Добавьте для обработчика события подписку на событие
OnChange
объектаSqlDependency
.Выполните команду, используя любой из методов
Execute
объектаSqlCommand
. Так как команда связана с объектом уведомления, сервер распознает, что он должен сгенерировать уведомление, и информация об очереди будет указывать на очередь зависимостей.Остановите подключение объекта
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);
}
Дальнейшие действия
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по