4

MS SQL Server 2005 で実行されているデータベースと ASP.NET 3.5 Web アプリケーションがあります。

データベースには、Web アプリで実行されている 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();
}
4

2 に答える 2

16

データベースを確認してくださいsys.transmission_queue。ほとんどの場合、あなたの通知はそこにあり、配信できないため保持されます。transmission_statusなぜこれが起こっているのか説明があります。詳細なトラブルシューティング ガイドについては、「トラブルシューティング ダイアログ」を参照してください。

最もよくある問題は、孤立したデータベースの dbo 所有権によって EXECUTE AS インフラストラクチャの要件が満たされていないことが原因であり、次の方法で解決できます。

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

ただし、上記で調査したように、解決策は実際の問題に応じてケースバイケースで異なります。

于 2010-08-23T14:17:15.247 に答える