我有一个在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();
}
答案 0 :(得分:12)
检查您的数据库sys.transmission_queue
。您的通知很可能会在那里,因为无法发送而保留。 transmission_status
会解释为什么会发生这种情况。有关更详细的故障排除指南,请参阅Troubleshooting Dialogs。
最常见的问题是由于孤立的数据库dbo所有权无法满足EXECUTE AS基础结构要求,可以通过以下方式解决:
ALTER AUTHORIZATION ON DATABASE::<dbname> TO [sa];
然而,根据具体情况,解决方案取决于实际问题,如上所述。
答案 1 :(得分:0)
您的选择错误。您必须明确声明查询。 从Microsoft SQL文档中:
必须明确声明SELECT语句中的预计列,并且表名必须由两部分组成。请注意,这意味着该语句中引用的所有表必须位于同一数据库中。