加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SqlDependency学习笔记

发布时间:2020-12-12 14:58:30 所属栏目:MsSql教程 来源:网络整理
导读:? sqlDependency提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的. 快速上手可参见园友的下列文章 http://www.cnblogs.com/xrinehart/archive/2006/07/
?

sqlDependency提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的.

快速上手可参见园友的下列文章

http://www.cnblogs.com/xrinehart/archive/2006/07/27/461106.html .NET 2.0 SqlDependency快速上手指南
http://www.cnblogs.com/gesenkof99/archive/2008/12/19/1358584.html 采用SQLServer2005 Broker和SqlDependency类来提供数据更改通知(原创)


这里参考他们的文章,自己也做了一个小的示例程序(Sql2005环境)

?

1.先建一个测试表

CREATE ? TABLE ? [ dbo ] . [ Messages ] (
????
[ ID ] ? [ int ] ? IDENTITY ( 1 , 1 )? NOT ? NULL ,
????
[ UserID ] ? [ varchar ] ( 50 )?COLLATE?Chinese_PRC_CI_AS? NOT ? NULL ,
????
[ Message ] ? [ nvarchar ] ( 256 )?COLLATE?Chinese_PRC_CI_AS? NOT ? NULL ,
?
CONSTRAINT ? [ PK_Messages ] ? PRIMARY ? KEY ? CLUSTERED ?
(
????
[ ID ] ? ASC
)
WITH ?(PAD_INDEX?? = ? OFF ,?STATISTICS_NORECOMPUTE?? = ? OFF ,?IGNORE_DUP_KEY? = ? OFF ,?ALLOW_ROW_LOCKS?? = ? ON ,?ALLOW_PAGE_LOCKS?? = ? ON )?

ON ? [ PRIMARY ]
)

然后可以利用Sql2005的管理器,随便输入几条数据

?2.控制台程序主要代码

using?System;
using?System.Configuration;
using?System.Data;
using?System.Data.SqlClient;

namespace?SqlDependencyTest
{
????
class?Program
????{
????????
private?static?string?_connStr;

????????
static?void?Main(string[]?args)
????????{
????????????_connStr?
=?ConfigurationManager.ConnectionStrings["ConnStr"].ToString();
????????????SqlDependency.Start(_connStr);
//传入连接字符串,启动基于数据库的监听
????????????UpdateGrid();

????????????Console.Read();
????????}


????????
private?static?void?UpdateGrid()
????????{
????????????
using?(SqlConnection?connection?=?new?SqlConnection(_connStr))
????????????{
????????????????
//依赖是基于某一张表的,而且查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo]
????????????????using?(SqlCommand?command?=?new?SqlCommand("select?ID,UserID,[Message]?From?[dbo].[Messages]",?connection))
????????????????{
????????????????????command.CommandType?
=?CommandType.Text;
????????????????????connection.Open();
????????????????????SqlDependency?dependency?
=?new?SqlDependency(command);
????????????????????dependency.OnChange?
+=?new?OnChangeEventHandler(dependency_OnChange);

???????????????????SqlDataReader?sdr?
=?command.ExecuteReader();
???????????????????Console.WriteLine();
???????????????????
while?(sdr.Read())
???????????????????{
???????????????????????Console.WriteLine(
"Id:{0}tUserId:{1}tMessage:{2}",sdr["ID"].ToString(),?sdr["UserId"].ToString(),?sdr["Message"].ToString());
???????????????????}
???????????????????sdr.Close();
????????????????}
????????????}
????????}


????????
private?static?void?dependency_OnChange(object?sender,?SqlNotificationEventArgs?e)
????????{
????????????UpdateGrid();
????????}
????}
}

3.测试运行

运行该控制台程序后,会输出[Messages]表的所有数据,这时不要关闭控制台程序,直接在Sql2005的管理器里对[Messages]表的数据做些修改(比如新增/删除等),再看一下控制台,会发现自动重新输出了新的数据.


注意:如果在web应用中,因为页面必须通过浏览器请求才能激活服务端的处理,所以页面一旦处理完成并显示到浏览器后,放着不动的情况下,OnChange事件始终是得不到触发的.

最后再推荐一篇园子里高人的文章:
http://www.cnblogs.com/artech/archive/2008/08/11/1265055.html 是结合Enterprise Library的缓存应用程序块与SqlDependency的综合应用,写得很不错,强烈推荐想使用缓存的朋友看看.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读