Почему моя SqlDependency не запускается - PullRequest
3 голосов
/ 23 августа 2010

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

1 Ответ

12 голосов
/ 23 августа 2010

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

Чаще всего проблема возникает из-за того, что требования к инфраструктуре EXECUTE AS не удовлетворяются владельцем базы данных потерянных баз данных и могут быть решены посредством:1007 *

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

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

...