У меня есть база данных, работающая на MS SQL Server 2005, и веб-приложение ASP.NET 3.5.
База данных содержит каталог продуктов, который я использую для подачи «страниц» в 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();
}