关于SqlDependency类的使用和应用场景介绍
sqldependency类
简介:
sqldependency提供了这样一种能力:当被监测的中的数据发生变化时,sqldependency会自动触发onchange事件来通知应用程序,从而达到让自动更新数据(或缓存)的目的。
应用场景:
当数据库中的数据发生变化时,需要更新缓存,或者需要更新与之相关的业务数据,又或者是发送邮件或者短信什么的等等情况时,如果数据库是sql server,可以考虑使用sqldependency监控数据库中的某个表的数据变化,并出发相应的事件。
应用程序前提条件:
在应用程序启动时,启动sqldependency针对sqlserver连接的监控。
在应用程序结束时,停止sqldependency针对sqlserver连接的监控。
web应用程序:
protectedvoidapplication_start()
{
system.data.sqlclient.sqldependency.start(configurationmanager.connectionstrings["framework_sqlserver"].connectionstring);
}
protectedvoidapplication_end(objectsender,eventargse)
{
system.data.sqlclient.sqldependency.stop(configurationmanager.connectionstrings["framework_sqlserver"].connectionstring);
}
windows应用程序:
staticvoidmain(string[] args)
{
_connstr =configurationmanager.connectionstrings["framework_sqlserver"].tostring();
sqldependency.start(_connstr);//传入连接字符串,启动基于数据库的监听
…
sqldependency.stop(_connstr);//传入连接字符串,启动基于数据库的监听
}
具体应用:
//当表中的数据发生变化时,出发onchangeeventhandler事件
privatestaticvoidupdategrid()
{
using(sqlconnectionconnection =newsqlconnection(_connstr))
{
//依赖是基于某一张表的,而且查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo].[]
using(sqlcommandcommand =newsqlcommand(" select id,taskname,completionnumber,uploadfilepath,querycount,starttime,endtime,taskstatus,downloadfilepath,creater,createdate from [dbo].[res_batchquery] where id = 70 ", connection))
{
command.commandtype =commandtype.text;
connection.open();
sqldependencydependency =newsqldependency(command);
dependency.onchange +=newonchangeeventhandler(dependency_onchange);
sqldatareadersdr = command.executereader();
console.writeline();
while(sdr.read())
{
console.writeline("id:{0}\\taskname:{1}\\completionnumber:{2}", sdr["id"].tostring(), sdr["taskname"].tostring(), sdr["completionnumber"].tostring());
}
sdr.close();
}
}
}
//具体事件
privatestaticvoiddependency_onchange(objectsender,sqlnotificationeventargse)
{
if(e.type ==sqlnotificationtype.change) //只有数据发生变化时,才重新获取并数据
{
updategrid();
}
}
需要注意的事项:
1、应用程序开始或者结束时,必须相应的开始或者停止对sql server的监控。
2、只有sql语句中需要查询的字段才会被监控,没有查询的数据发生变化时,并不会触发dependency_onchange事件。
3、查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo].[]。
4、where条件中的数据不能太复杂,不然可能不会被监控到。
5、待查询的字段的数据也不能太复杂。测试时,有个字段保存json格式的数据。如果将这个字段也写入到sql语句中,则不会被监控到。
sqlserver需要的相关配置(这里用到了service broker):
//设置某个数据库代理的回滚
alter database [dbname] set new_broker with rollback immediate;
//设置某个数据库的代理
alter database [dbname] set enable_broker;
//查询某个数据库是否已经启动了代理
select is_broker_enabled from sys.databases where name = '[dbname]'
is_broker_enabled为0表示未启动代理
is_broker_enabled为1表示已启动代理