关于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表示已启动代理

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐