Уведомления SQL Server - My OnChange не запускается - PullRequest
4 голосов
/ 15 декабря 2009

Я хотел бы использовать уведомления SQL Server для захвата событий вставки в моей базе данных в приложении winforms. Я пытаюсь использовать объект SQLDependency. Статьи MSDN заставляют это казаться довольно прямым. Поэтому я создал небольшой пример приложения, чтобы попробовать его. Похоже, что событие происходит только при первом входе в приложение (появляется MessageBox). Вставка данных в таблицу не вызывает событие OnChange, как это может показаться. Может кто-нибудь сказать мне, что мне не хватает? Спасибо!

 public Main()
    {
        InitializeComponent();
        var check = EnoughPermission();
        SqlDependency.Stop(constr);
        SqlDependency.Start(constr);
        if(connection == null)
        {
            connection = new SqlConnection(constr);
        }
        if(command == null)
        {
            command = new SqlCommand("Select ID, ChatMessage FROM dbo.Chat",connection);
        }
        connection.Open();
        command.Notification = null;
        SqlDependency dependency = new SqlDependency(command);
        dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
        command.ExecuteReader();
    }





    private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        MessageBox.Show("Change!");
    }

Ответы [ 2 ]

11 голосов
/ 13 октября 2011

Пока я работал над реализацией уведомлений о запросах, у меня возникла точная проблема. Я проверил все конфигурации, фрагменты кода и даже настройки TCP, но ничего не помогло. Затем я выяснил следующий запрос для запуска в базе данных, и он решил мою проблему. Может быть, вы можете попробовать это.

ALTER AUTHORIZATION ON DATABASE::[Your DB] TO sa;
6 голосов
/ 15 декабря 2009

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

Если ваш запрос получил немедленное уведомление, это означает, что вы получили уведомление не об изменении, а о неправильном запросе. Проверьте значения полученного аргумента SqlNotificationEventArgs. Отметьте Информация как Вставить / Обновить / Удалить, отметьте Источник как Данные, отметьте Тип , чтобы Изменить.

Взгляните на пример Watcher Application , чтобы лучше понять, как вы должны переподписываться при получении уведомления. Чтобы лучше понять, как работают уведомления о запросах, см. Таинственное уведомление .

...