У меня есть база данных, работающая на MS SQL Server 2005 и веб-приложение ASP.NET 3.5.Почему моя SqlDependency не работает
База данных содержит каталог продуктов, который я использую для подачи «страниц» в CMS, запущенную в веб-приложении. После создания страниц приложение кэширует их, поэтому мне нужно уведомить приложение об этом изменении, чтобы оно могло воссоздать объекты страницы.
CMS использует свое собственное кэширование, поэтому SqlCacheDependency не может использоваться для выполнения этой задачи.
Когда я огонь приложение вверх я получить абонент, появляющаяся в результате
select * from sys.dm_qn_subscriptions
Но как только я добавить некоторые данные в таблице, абонент исчезает и OnChanged событие не срабатывает.
В моем коде запуска я следующий
// Ensure the database is setup for notifications
SqlCacheDependencyAdmin.EnableNotifications(DataHelper.ConnectionString);
SqlCacheDependencyAdmin.EnableTableForNotifications(DataHelper.ConnectionString, "Category");
SqlCacheDependencyAdmin.EnableTableForNotifications(DataHelper.ConnectionString, "Product");
if (!SqlDependency.Start(DataHelper.ConnectionString, SqlDependencyQueueName))
throw new Exception("Something went wrong");
string queueOptions = string.Format("service = {0}", SqlDependencyQueueName);
using (var connection = new SqlConnection(DataHelper.ConnectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(@"SELECT [CategoryID],[Name]
FROM [dbo].[Category]", connection))
{
// Create a dependency and associate it with the SqlCommand.
dependency = new SqlDependency(command, queueOptions, 0);
// Subscribe to the SqlDependency event.
dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);
command.ExecuteReader().Close();
}
}
// ...
void OnDependencyChange(object sender, SqlNotificationEventArgs e)
{
Debugger.Break(); // This never hits
this.ReloadData();
}
Кстати, вы должны всегда проверять элементы SqlNotificationEventArg перед перезагрузкой данных. В противном случае вы рискуете внедрить в производство жесткую петлю, которая перезагружается при каждом неправильном заявлении или некорректном уведомлении настроек. И лучше просто недействить кеш и позволить следующему доступу загружать данные, а не проактивно перезагружать уведомление (по тем же причинам, чтобы избежать плохой ситуации, когда он петли плотно). –