風語·深蓝

Agile Methodology, HeadStorm And MindMap, they will change me.
posts - 58, comments - 331, trackbacks - 14, articles - 13

.NET 2.0 SqlDependency快速上手指南

Posted on 2006-07-27 15:27 風語者·疾風 阅读(2796) 评论(4)  编辑 收藏 网摘 所属分类: VS.Net 2005

此文以SQL Server 2005上实现为准,SQL Server 2000因为实现机制不同,请查阅相关资料。

 

       步骤一:在SQL Server 2005上执行ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;语句让相应的数据库启用监听服务,以便支持SqlDependency特性。

       这条语句最好在数据库未执行任何事务的情况下执行。

 

       步骤二:调用SqlDependency.Start(String strConnectionString)方法,在应用程序端启用依赖监听器。

       该方法的参数为一个数据库的连接字符串,该数据库必须已经执行过步骤一的操作。

       对于同一连接字符串,若已经执行过该语句,再次执行不会发生任何异常,但返回值会为False.

       如果是在Web程序中使用,建议可以将该语句放在Application_Start事件中执行。

       监听是基于数据库的,而依赖才可以基于表或者查询。

 

       步骤三:该步骤分别有两种不同的做法。该阶段必须注意步骤。

              方法A:建立连接对象,再创建一个SqlCommand实例,创建SqlCacheDependency实例,在这步之后再调用Command对象来获取数据(这个顺序很重要)。之后调用CacheInsert语句建立一个依赖于一个具体查询数据集的Cache项。


             
SqlConnection conn = new SqlConnection(strConnection);

         SqlCommand command = new SqlCommand(strCommandText, conn);

         SqlCacheDependency dependency = new SqlCacheDependency(command);

        

         // 注册方法到委托,该委托是

         CacheItemRemovedCallback onRemove = new CacheItemRemovedCallback(RemovedCallback);

         // 新增或修改一条缓存记录

         Cache.Insert(strCacheKey, objAppCache, dependency, absoluteExpiration, slidingExpiration, CacheItemPriority.Default, onRemove);

 

          方法B:建立连接对象,再创建一个SqlCommand实例,最后创建SqlDependency实例。定义SqlDependency的委托OnChange,当数据发生改变时做出相应的处理(比如清除Cache)。

              SqlConnection conn = new SqlConnection(strConnection);

         SqlCommand command = new SqlCommand(strCommandText, conn);

         SqlCacheDependency dependency = new SqlCacheDependency(command);

             

              dependency.OnChange += new OnChangeEventHandler(Dependency_OnChange);

 

 

     注意事项:

       不知道是不是还存在BUG,我在项目开发中遇到一些奇怪的现象。同样的代码,在有的机器上运行则能捕捉到变化,有的则完全没反应;也有时会出现Cache刚建立就反复发生依赖改变的事件。偶尔Cache还会数据发生变化却不引发事件。

       但从最终项目实施的情况看,似乎都只是某些机器环境造成的不确定因素?这个无法确定。不过起码数据库端是否正常启用,可以通过SQL Server Profiler来查看监视。

Feedback

#1楼   回复  引用  查看    

2006-07-28 14:08 by King_Boy_Hcc      
SQL Server 2005 与 SQL 2000 相差好大哦..就不知道怎么在05中执行数据库语句和建表,呵呵, 有空指导小弟一下了, 真想把05卸了又不甘心,呵呵

#2楼   回复  引用  查看    

2006-07-29 09:00 by 阿不      
与我现在的SqlDependency的实现方式不一样,难道我的实现方式是2000下的,不过它也支持SQL 2005?这种方式在SQL 2005中性能会更高吗?

#3楼   回复  引用    

2006-08-01 14:00 by Simons[未注册用户]
我按照楼主的例子做了一下,用WinForm做的,但是出现了以下问题:

回调函数执行的时候 大概说CLR权限不够,这个怎么办呢??
我也没有找到解决方案,请指点一下,
zhaogaoxin@gmail.com
thanks

#4楼[楼主]   回复  引用  查看    

2006-08-06 00:15 by 風語者·疾風      
@阿不
SQL Server 2000 是用轮询的机制去实现的,所以不论是时效性和性能都会差一些。
SQL Server 2005是通过新的双方通讯监听机制实现的,所以效率会更好一些。


@Simons
没太看明白你的问题是什么意思?CLR权限不足应该和缓存没有什么关系的吧。应该是代码的其他问题。



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 461106




相关文章:

相关链接: