步骤:
1、必须在 MSDB 数据库中的 QueryNotificationService 服务上向Guest用户授予发送权限。方法如下,注意要区分大小写。
USE MSDB
GRANT SEND ON SERVICE::
[http://schemas.microsoft.com/SQL/Notifications/QueryNotificationService]
TO GUEST
2、启用CLR在一个消息到达服务队列时,一个包含.Net代码的存储过程sp_DispatcherProc将使用一个队列来派发消息。因此必须启用Sql Server中的CLR功能。启用方法如下:
Use Master
Exec sp_configure 'clr enabled',1
Reconfigure
3、SqlDependency 对象会使用 Service Broker 将消息发送给 QueryNotificationService服务,所以需要启用 Service Broker,可以通过下边语句查看是否启用。
select DatabasePropertyex('Northwind','IsBrokerEnabled')
--返回1表示true,返加0表示false
启动Service Broker语句如下:
use master
Alter Database Northwind set enable_broker
或者使用
ALTER DATABASE DBName SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE DBName SET ENABLE_BROKER;
4、如果还不能触发事件,可以考虑使用一下语句:
ALTER AUTHORIZATION ON DATABASE::<dbname> TO [sa];
5、示例方法:
private SqlDependency dependency_Terminal = null;
private void DependencyTerminal()
{
dtTerminal.Clear();
SqlConnection connection2 = new SqlConnection(constr);
try
{
string sqlTerminal = "Select TerminalID,ExtStatus from [dbo].[Terminal]";//注意,sql语句中的表名最好用“[]“括起来,并以”[dbo].[*]的格式“。
SqlCommand command2 = new SqlCommand(sqlTerminal, connection2);
connection2.Open();
dependency_Terminal = new SqlDependency(command2);
SqlDependency.Start(constr);
dependency_Terminal.OnChange += new OnChangeEventHandler(dependency_Terminal_OnChange);
SqlDataReader da2 = command2.ExecuteReader();
dtTerminal.Load(da2);
}
catch
{
connection2.Close();
}
finally
{
connection2.Close();
}
}
void dependecy_TerminalInstall_OnChange(object sender, SqlNotificationEventArgs e)
{
//检测到数据库添加修改操作
//Dosomething...
}
6、可能出现问题解决:
在depenency_OnChange方法connection.Open()与SqlDataReader sdr = command.ExecuteReader()之间插入
SqlDependency dependency = new SqlDependency(command)和 dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
解决只能实现一次依赖的问题。
本文介绍为sqlserver 数据库
浙公网安备 33010602011771号