?
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的综合应用,写得很不错,强烈推荐想使用缓存的朋友看看.
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|