zoukankan      html  css  js  c++  java
  • [转]SQL server 2008R2 中 C#Winfoirm 使用 SqlDependency 机制实现 数据库中某一张表的监视

    转自:https://blog.csdn.net/u012183487/article/details/77776930

    System.Data.SqlClient命名空间下的 sqlDependency类 可以实现这样的功能:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发dependency_OnChange()事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的.

    如下介绍实现方法及其中可能会遇到的问题。

    首先,建立一个一个数据库 并在其中建立一张表,如下图所示:

    表中的内容如下:

    接下来 在VS2012中建立一个C#控制台应用程序,实现表的内容的监控,当表的数据发生变化时, 控制台会实时输出变化。控制台应用程序如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.SqlClient;
    using System.Data;
     
     
    namespace SqlDependencyDemo
    {
        class Program
        {
            private static string _connStr;
            static void Main(string[] args)
            {
                _connStr = "Data Source =(local);Database = DBforStudy; UID = sa; Pwd = sa"; 
                SqlDependency.Start(_connStr);//传入连接字符串,启动基于数据库的监听  
                UpdateGrid();
     
                Console.Read();
            }
     
            private static void UpdateGrid()
            {
                using (SqlConnection connection = new SqlConnection(_connStr))
                {
                    //依赖是基于某一张表的,而且查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo].[]  
                    using (SqlCommand command = new SqlCommand("select USERS,PASSWORD From dbo.T_USERS", 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("USERS:{0}	PASSWORD:{1}	", sdr["USERS"].ToString(), sdr["PASSWORD"].ToString());
                        }
                        sdr.Close();
                    }
                }
            }
     
            private static void dependency_OnChange(object sender, SqlNotificationEventArgs e)
            {
                UpdateGrid();
            }  
        }
    }

    运行程序,这个过程中可能会抛出错误:

    “未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker”

    在数据库中新建查询:输入如下代码:

    --语法为:SELECT is_broker_enabled FROM sys.databases WHERE name = 'DATABSE_NAME' --DATABASE_NAME 为数据库名称 此处为 DBforStudy
    SELECT is_broker_enabled FROM sys.databases WHERE name = 'DBforStudy'

    然后,执行完上一句话之后,再次只执行下面的这句话:

    ALTER DATABASE DBforStudy  SET ENABLE_BROKER;

    这时,再次运行 

    SELECT is_broker_enabled FROM sys.databases WHERE name = 'DBforStudy'

    返回的结果变成了1

    然后再次运行C#控制台应用程序,效果如下:

     此时,不要关闭控制台应用程序,往数据库的表中写入数据,比如 我添加两行数据 0000,0000;1111,1111;

    可见 每一次添加数据时 控制台就相应输出了新添加的内容。

  • 相关阅读:
    【转】深入理解JavaScript闭包(closure)
    【转】js之匿名函数
    【转】jQuery选择器大全
    模拟切水果的游戏以达到对JavaScript的一些基本语法操作的练习
    JavaScript增加一个随机颜色的div,并在一定时间后div自动消失
    程序猿,千万别说你不了解Docker!
    了解ASCII、gb系列、Unicode、UTF-8的区别
    ASCII、Unicode、GBK和UTF-8字符编码的区别联系
    X86服务器、小型机、大型机、塔式、机架式、刀片式服务器、工作站
    云、Iaas、Paas、Saas
  • 原文地址:https://www.cnblogs.com/sungong1987/p/11131011.html
Copyright © 2011-2022 走看看