Уведомление SqlDependency - немедленное уведомление об ошибке после выполнения запроса - PullRequest
8 голосов
/ 30 октября 2011

У меня возникла проблема, когда я пытаюсь настроить уведомления SqlDependency для получения уведомлений при изменении данных в таблице на сервере SQL Server. Однако, как только я выполняю запрос, который я использую для установки зависимости sql, сразу же приходит уведомление о том, что попытка подписки не удалась из-за проблемы с оператором sql (SqlNotificationEventArgs shows Info: Invalid, Source: Statement, Type: Subscribe)

Это указывает на то, что существует проблема с запросом sql, но, попробовав очень простой пример, чтобы убедиться, что это не проблема с оператором select, я все еще получаю эти «недействительные» уведомления немедленно. Я также убедился, что я запустил брокер служб SQL Server, создал службу очередей и уведомлений и предоставил все необходимые разрешения для участника (в этом случае пользователь, с которым я подключаюсь к серверу sql) Вот мой стол:

CREATE TABLE [dbo].[TableTest](
    [id] [int] NOT NULL,
    [val1] [int] NULL,
    [val2] [int] NULL,
   CONSTRAINT [PK_TableTest] PRIMARY KEY CLUSTERED ( [id] ASC )
) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
        ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

вот код:

 SqlDependency.Start(connectStr);
 _connection = new SqlConnection(connectStr);
 _connection.Open();
 _sqlCommand = new SqlCommand("Select [id] from TableTest", _connection);
 _sqlCommand.Notification = null;
 SqlDependency dependency = new SqlDependency(_sqlCommand);
 dependency.OnChange += this.OnDataChangeNotification;

 DataTable dt = new DataTable();
 dt.Load(_sqlCommand.ExecuteReader());

После вызова _sqlCommand.ExecuteReader () 'немедленно вызывается обработчик OnDataChangeNotification с параметром SqlNotificationEventArgs, показывающим Info: Invalid, Source: Statement, Type: Subscribe.

Кто-нибудь знает, в чем может быть проблема или как определить / отладить, что это такое (без использования профилировщика SQL, которого у меня нет atm).

1 Ответ

19 голосов
/ 30 октября 2011

Вы должны использовать два имени части (dbo.TableName) для своих таблиц в операторе выбора SQL, чтобы использовать уведомление SqlDependency:

SqlDependency.Start(connectStr); 
_connection = new SqlConnection(connectStr); 
_connection.Open(); 
_sqlCommand = new SqlCommand("Select [id] from dbo.TableTest", _connection); 
_sqlCommand.Notification = null; 
SqlDependency dependency = new SqlDependency(_sqlCommand); 
dependency.OnChange += this.OnDataChangeNotification; 

Вот ссылка на требования для уведомлений о запросах: MSDN Query Notification .

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...