欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于SqlDependency类的使用和应用场景介绍

程序员文章站 2022-03-09 21:26:32
sqldependency类 简介: sqldependency提供了这样一种能力:当被监测的中的数据发生变化时,sqldependency会自动触发onchange事件来通知应用程序,从而达到让自...

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