关于SQL中,C#监视某张表SqlDependency学习笔记 .

来源:互联网 发布:海龟交易策略 python 编辑:程序博客网 时间:2024/05/20 08:01
 

         sqlDependency提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的.

 

         1.创建一个测试表结构

             CREATE TABLE [dbo].[Messages](  

                   [ID] [int] IDENTITY(1,1) NOT NULL,  

                   [UserID] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,  

                   [Message] [nvarchar](256) COLLATE Chinese_PRC_CI_AS NOT NULL,  

                  CONSTRAINT [PK_Messages] PRIMARY KEY CLUSTERED   

                 (  

                    [ID] ASC  

                 )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)   

                   ON [PRIMARY]  

                )  

          然后可以利用Sql2005的管理器,随便输入几条数据

 

        2.控制台程序主要代码

 using System; 
using System.Configuration; 
using System.Data; 
using System.Data.SqlClient; 
 
namespace SqlDependencyTest 

    class Program 
    { 
        private static string _connStr; 
 
        static void Main(string[] args) 
        { 
            _connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ToString(); 
            SqlDependency.Start(_connStr);//传入连接字符串,启动基于数据库的监听  
            UpdateGrid(); 
 
            Console.Read(); 
        } 
 
 
        private static void UpdateGrid() 
        { 
            using (SqlConnection connection = new SqlConnection(_connStr)) 
            { 
                //依赖是基于某一张表的,而且查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo].[]  
                using (SqlCommand command = new SqlCommand("select ID,UserID,[Message] From [dbo].[Messages]", connection)) 
                { 
                    command.CommandType = CommandType.Text; 
                    connection.Open(); 
                    SqlDependency dependency = new SqlDependency(command); 
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 
 
                   SqlDataReader sdr = command.ExecuteReader(); 
                   Console.WriteLine(); 
                   while (sdr.Read()) 
                   { 
                       Console.WriteLine("Id:{0}\tUserId:{1}\tMessage:{2}",sdr["ID"].ToString(), sdr["UserId"].ToString(),  
 
sdr["Message"].ToString()); 
                   } 
                   sdr.Close(); 
                } 
            } 
        } 
 
 
        private static void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
        { 
            UpdateGrid(); 
        } 
    } 

3.启用Service broker

    ALTER DATABASE DB_NAME SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
    ALTER DATABASE DB_NAME SET ENABLE_BROKER;

 

4.测试运行

运行该控制台程序后,会输出[Messages]表的所有数据,这时不要关闭控制台程序,直接在Sql2005的管理器里对[Messages]表的数据做些修改(比如新增/删除等),再看一下控制台,会发现自动重新输出了新的数据.

 

注意:如果在web应用中,因为页面必须通过浏览器请求才能激活服务端的处理,所以页面一旦处理完成并显示到浏览器后,放着不动的情况下,OnChange事件始终是得不到触发的.

 


  

 

 

 

 

原创粉丝点击