2010-08-23 1 views
3

У меня есть база данных, работающая на 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(); 
} 
+2

Кстати, вы должны всегда проверять элементы SqlNotificationEventArg перед перезагрузкой данных. В противном случае вы рискуете внедрить в производство жесткую петлю, которая перезагружается при каждом неправильном заявлении или некорректном уведомлении настроек. И лучше просто недействить кеш и позволить следующему доступу загружать данные, а не проактивно перезагружать уведомление (по тем же причинам, чтобы избежать плохой ситуации, когда он петли плотно). –

ответ

11

Проверьте базу данных sys.transmission_queue. Скорее всего, ваши уведомления будут там, сохранены, потому что они не могут быть доставлены. У transmission_status будет объяснение, почему это происходит. Более подробное руководство по устранению неполадок см. В разделе Troubleshooting Dialogs.

Наиболее часто проблема обусловлена ​​EXECUTE AS требований к инфраструктуре не удовлетворенным осиротевшей база данных собственности ДБ и может быть решена с помощью:

ALTER AUTHORIZATION ON DATABASE::<dbname> TO [sa]; 

однако решение зависит от случая к случаю, в зависимости от фактического проблема, как было исследовано выше.

+0

Можете ли вы посмотреть на мой вопрос. Я не знаю, почему он не работает: https://stackoverflow.com/questions/46434652/sqldependency-not-firing –