使用SqlDependency监听MSSQL数据库表变化通知
2013-06-07 22:49
267 查看
SqlDependency提供了这样一种机制,当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的。
首先要对数据库进行配置,配置命令如下:
1.启用Service Broker并查看是否启用成功,is_broker_enabled为1则表明启用成功:
ALTER DATABASE SqlDepTest SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE SqlDepTest SET ENABLE_BROKER;
SELECT is_broker_enabled FROM sys.databases WHERE name = 'SqlDepTest'
2.开启帐号订阅权限,由于sa帐号不支持权限设置,所以需要建立单独的帐号。
use master
GRANT CREATE PROCEDURE TO sqldep
GRANT CREATE QUEUE TO sqldep
GRANT CREATE SERVICE TO sqldep
use master
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO sqldep
exec sp_helprotect NULL, sqldep
C#示例代码如下:
首先要对数据库进行配置,配置命令如下:
1.启用Service Broker并查看是否启用成功,is_broker_enabled为1则表明启用成功:
ALTER DATABASE SqlDepTest SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE SqlDepTest SET ENABLE_BROKER;
SELECT is_broker_enabled FROM sys.databases WHERE name = 'SqlDepTest'
2.开启帐号订阅权限,由于sa帐号不支持权限设置,所以需要建立单独的帐号。
use master
GRANT CREATE PROCEDURE TO sqldep
GRANT CREATE QUEUE TO sqldep
GRANT CREATE SERVICE TO sqldep
use master
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO sqldep
exec sp_helprotect NULL, sqldep
C#示例代码如下:
private const string SQL_CONNECTIONSETTINGS = ""; static void Main(string[] args) { //传入连接字符串,启动基于数据库的监听 SqlDependency.Start(SQL_CONNECTIONSETTINGS); HandleMessage(); Console.Read(); } /// <summary> /// 触发处理消息机制 /// </summary> private static void HandleMessage() { using (SqlConnection connection = new SqlConnection(SQL_CONNECTIONSETTINGS)) { //依赖是基于某一张表的,而且查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo].[] using (SqlCommand command = new SqlCommand("SELECT [MessageID],[Messages],[CreateTime] FROM [dbo].[Messages]", connection)) { int messageID = 0; command.CommandType = CommandType.Text; connection.Open(); command.Notification = null; SqlDependency dependency = new SqlDependency(command); dependency.OnChange += new OnChangeEventHandler(Dependency_OnChange); SqlDataReader sdr = command.ExecuteReader(); while (sdr.Read()) { int.TryParse(sdr["MessageID"].ToString(), out messageID); ProcessMessage(messageID); Console.WriteLine("MessageID:{0}\tMessages:{1}\tCreateTime:\t{2}", sdr["MessageID"].ToString(), sdr["Messages"].ToString(), sdr["CreateTime"].ToString()); CompleteProcessMessage(messageID, 2); } sdr.Close(); } } } /// <summary> /// SQL消息触发事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void Dependency_OnChange(object sender, SqlNotificationEventArgs e) { SqlDependency dependency = sender as SqlDependency; dependency.OnChange -= Dependency_OnChange; HandleMessage(); } /// <summary> /// 处理消息 /// </summary> /// <param name="messageID">消息编号</param> private static void ProcessMessage(int messageID) { using (SqlConnection connection = new SqlConnection(SQL_CONNECTIONSETTINGS)) { string sql = string.Format(@"INSERT INTO [dbo].[MessagesComplete] SELECT [MessageID],[Messages],1,[CreateTime],GETDATE() FROM [dbo].[Messages] WHERE [MessageID] = {0} DELETE FROM [dbo].[Messages] WHERE [MessageID] = {0}", messageID); using (SqlCommand command = new SqlCommand(sql, connection)) { command.CommandType = CommandType.Text; connection.Open(); command.ExecuteNonQuery(); command.Dispose(); } } } /// <summary> /// 消息处理完成,更新消息处理状态 /// </summary> /// <param name="messageID">消息编号</param> /// <param name="status">状态:1.处理中,2.处理完成,-1.处理失败</param> private static void CompleteProcessMessage(int messageID, int status) { using (SqlConnection connection = new SqlConnection(SQL_CONNECTIONSETTINGS)) { string sql = string.Format("UPDATE [dbo].[MessagesComplete] SET [Status] = {1} WHERE [MessageID] = {0}", messageID, status); using (SqlCommand command = new SqlCommand(sql, connection)) { command.CommandType = CommandType.Text; connection.Open(); command.ExecuteNonQuery(); command.Dispose(); } } }
相关文章推荐
- 使用SqlDependency监听MSSQL数据库表变化通知
- Android 使用ContentProvider对外共享数据与监听ContentProvider数据的变化
- sqlDependency监控数据库数据变化,自动通知
- sqlDependency提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的.
- 4.3使用ContentObserver监听ContentProvider中的数据变化
- 使用android中ContentProvider组件对外共享以及监听ContentProvider中数据的变化
- linkedin databus介绍——监听数据库变化,有新数据到来时通知其他消费者app,新数据存在内存里,多份快照
- Data binding的使用(三)----监听数据的变化
- 使用SqlDependency监听SqlServer2005数据库变更通知
- 基于vue-cli的vue项目之vuex的使用5------watch监听vuex内部数据变化
- sqlDependency监控数据库数据变化,自动通知
- 使用SqlDependency监听SqlServer2005数据库变更通知
- 使用SqlDependency监听SqlServer2005数据库变更通知
- 获悉文件服务器上的变化和数据访问情况,推荐使用NetWrix文件服务器免费变更通知工具
- Android使用ContentObserver监听数据库变化 接受指定号码的短信,并且不让系统截取到通知用户
- Android之使用Contentprovider对外共享数据和实现数据监听变化
- sqlDependency监控数据库数据变化,自动通知
- 使用SqlDependency监听SqlServer2005数据库变更通知
- 使用SqlDependency监听SqlServer2005数据库变更通知
- Android使用ContentObserver监听数据库变化,截取系统通知用户接收到短信