如何使用SqlCacheDependency?

我需要为依赖于此查询的表实现SqlCacheDependency: SELECT Nickname FROM dbo.[User]

我为此创建了一个方法:

 private IEnumerable GetNicknamesFromCache() { const String cacheValueName = "Nicknames"; var result = HttpRuntime.Cache.Get(cacheValueName) as List; if (result == null) { result = _repository.GetAllNicknames(); var connectionString = ConfigurationManager.ConnectionStrings["RepositoryContext"].ConnectionString; var sqlConnection = new SqlConnection(connectionString); var sqlCommand = new SqlCommand("SELECT Nickname FROM dbo.[User]", sqlConnection); var sqlDependency = new SqlCacheDependency(sqlCommand); HttpRuntime.Cache.Insert(cacheValueName, result, sqlDependency); } return result; } 

但是,当我运行我的应用程序时,它不起作用。 我查看了订阅者列表( sys.dm_qn_subscriptions表)并且没有记录。

我调查了很多时间,并且已经尝试了各种解决方案,但它们对我不起作用:

  • 使用可信连接并为公共角色设置一些权限:

    GRANT CREATE PROCEDURE TO public
    GRANT CREATE QUEUE TO public
    GRANT CREATE SERVICE TO public
    GRANT SUBSCRIBE QUERY NOTIFICATIONS TO public
    GRANT SELECT ON OBJECT::dbo.[User] TO public
    GRANT RECEIVE ON QueryNotificationErrorsQueue TO public

  • 使用’sa’登录进行连接

  • 使用aspnet_regsql.exe( aspnet_regsql.exe -S localhost -E -ed -d TestTable -et -t User
  • 将配置添加到web.config中的system.webServer:







  • 将SqlDependency.Start()放入Global.asax Application_Start事件中

  • 在sql server的不同实例上运行(SQL Server 2008 Express,SQL Server 2008)

但它没有帮助。 它仍然无法正常工作。

我如何使其工作?

我已经找到了解决方案。

首先检查是否为您的表启用了Service Broker,并在需要时启用它:

 SELECT name, is_broker_enabled FROM sys.databases WHERE name = '' ALTER DATABASE  SET enable_broker WITH ROLLBACK IMMEDIATE 

接下来在SQL Server中创建新角色sql_dependency_rolesql_dependency_role授予权限并向用户授予角色:

 EXEC sp_addrole 'sql_dependency_role' GRANT CREATE PROCEDURE to sql_dependency_role GRANT CREATE QUEUE to sql_dependency_role GRANT CREATE SERVICE to sql_dependency_role GRANT REFERENCES on CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification] to sql_dependency_role GRANT VIEW DEFINITION TO sql_dependency_role GRANT SELECT to sql_dependency_role GRANT SUBSCRIBE QUERY NOTIFICATIONS TO sql_dependency_role GRANT RECEIVE ON QueryNotificationErrorsQueue TO sql_dependency_role EXEC sp_addrolemember 'sql_dependency_role', '' 

之后添加C#代码以使用SqlCacheDependencySqlDependency (大多数方式相同)。

我已经改变了我的方法,现在它看起来像这样:

 private IEnumerable GetNicknamesFromCache() { const String cacheValueName = "Nicknames"; var result = HttpRuntime.Cache.Get(cacheValueName) as List; if (result == null) { result = _repository.GetAllNicknames(); using (var connection = new SqlConnection(_config.ConnectionString)) { connection.Open(); SqlDependency.Start(_config.ConnectionString); var command = new SqlCommand("SELECT Nickname FROM dbo.[User]", connection); var dependency = new SqlCacheDependency(command); HttpRuntime.Cache.Insert(cacheValueName, result, dependency); command.ExecuteNonQuery(); } } return result; } 

现在它工作正常。

不要忘记在创建SqlCacheDependencySqlDependency之前调用SqlDependency.Start方法并在最后执行命令。