#c# #.net #sql-server-2005 #sql-server-2008 #ado.net
#c# #.net #sql-server-2005 #sql-server-2008 #ado.net
Вопрос:
У меня возникла проблема, когда я пытаюсь настроить уведомления о SqlDependency для получения уведомлений при изменении данных в таблице на сервере sql. Однако, как только я выполняю запрос, который я использую для настройки зависимости sql, немедленно приходит уведомление, указывающее, что попытка подписки не удалась из-за проблемы с sql statement ( SqlNotificationEventArgs shows Info: Invalid, Source: Statement, Type: Subscribe
)
Это указывает на то, что у меня проблема с sql-запросом, но, попробовав очень простой пример, чтобы убедиться, что это не проблема с оператором select, я по-прежнему немедленно получаю эти «недопустимые» уведомления. Я также убедился, что я запустил service broker SQL Server, создал службу очереди и уведомлений и предоставил все необходимые разрешения участнику (в данном случае пользователю, с которым я подключаюсь к sql server) Вот моя таблица:
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, отображающим информацию: Недопустимый, Источник: оператор, Тип:Subscribe .
Кто-нибудь знает, в чем может быть проблема или как определить / отладить, что это такое (без использования SQL profiler, которого у меня нет atm).
Ответ №1:
Вы должны использовать два имени частей (dbo.TableName) для ваших таблиц в инструкции SQL select, чтобы использовать уведомление о 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.
Надеюсь, это поможет.
Комментарии:
1. это было так. большое спасибо! Один дополнительный вопрос: есть ли способ определить, какие строки на самом деле были изменены?
2. @mike01010: Насколько я знаю, класс SqlDependency не предоставляет функциональности для отслеживания изменений.
3. Но вы можете выполнить немедленный запрос для поиска изменений, если знаете, что искать. (Например, если временная метка была обновлена при изменении, вы можете искать самую последнюю временную метку)