使用sql缓存依赖

Posted on 2013-10-30 17:26  Arnold_Lee  阅读(220)  评论(0)    收藏  举报

步骤:

1、必须在 MSDB 数据库中的 QueryNotificationService 服务上向Guest用户授予发送权限。方法如下,注意要区分大小写。

USE MSDB
GRANT SEND ON SERVICE::
[http://schemas.microsoft.com/SQL/Notifications/QueryNotificationService]
TO GUEST

 

2、启用CLR在一个消息到达服务队列时,一个包含.Net代码的存储过程sp_DispatcherProc将使用一个队列来派发消息。因此必须启用Sql Server中的CLR功能。启用方法如下:

Use Master
Exec sp_configure 'clr enabled',1
Reconfigure

 

3、SqlDependency 对象会使用 Service Broker 将消息发送给 QueryNotificationService服务,所以需要启用 Service Broker,可以通过下边语句查看是否启用。

select DatabasePropertyex('Northwind','IsBrokerEnabled')
--返回1表示true,返加0表示false

 

    启动Service Broker语句如下: 

use master
Alter Database Northwind set enable_broker

 

或者使用

ALTER DATABASE DBName SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE DBName SET ENABLE_BROKER;

 

4、如果还不能触发事件,可以考虑使用一下语句:

ALTER AUTHORIZATION ON DATABASE::<dbname> TO [sa];
 
5、示例方法:
  private SqlDependency dependency_Terminal = null;
  private void DependencyTerminal()
        {
            dtTerminal.Clear();
            SqlConnection connection2 = new SqlConnection(constr);
            try
            {
                string sqlTerminal = "Select TerminalID,ExtStatus from [dbo].[Terminal]";//注意,sql语句中的表名最好用“[]“括起来,并以”[dbo].[*]的格式“。
                SqlCommand command2 = new SqlCommand(sqlTerminal, connection2);
                connection2.Open();
                dependency_Terminal = new SqlDependency(command2);
                SqlDependency.Start(constr);
                dependency_Terminal.OnChange += new OnChangeEventHandler(dependency_Terminal_OnChange);
                SqlDataReader da2 = command2.ExecuteReader();
                dtTerminal.Load(da2);
            }
            catch
            {
                connection2.Close();
            }
            finally
            {
                connection2.Close();
            }
        }

   void dependecy_TerminalInstall_OnChange(object sender, SqlNotificationEventArgs e)
        {
   //检测到数据库添加修改操作
//Dosomething...
     }

 6、可能出现问题解决:
在depenency_OnChange方法connection.Open()与SqlDataReader sdr = command.ExecuteReader()之间插入
SqlDependency dependency = new SqlDependency(command)和 dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
解决只能实现一次依赖的问题。

本文介绍为sqlserver 数据库

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3