SQL server 2008R2 中 C#Winfoirm 使用 SqlDependency 机制实现 数据库中某一张表的监视

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}\tPASSWORD:{1}\t", 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'

此时返回的 is_broker_enabled de 结果是  0,

不要担心这个错误是因为数据库没有启动 Service Broker而导致的,解决办法很简单,步骤如下:

在上面新建查询中 把 单单执行下面这句话:

use DBforStudy
go
ALTER DATABASE DBforStudy SET NEW_BROKER WITH ROLLBACK IMMEDIATE;


然后,执行完上一句话之后,再次只执行下面的这句话:
ALTER DATABASE DBforStudy  SET ENABLE_BROKER;


这时,再次运行 

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

返回的结果变成了1

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



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


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


首先,在IDEA需要引入SqlServer的JDBC驱动,可以在pom.xml文件添加如下依赖: ```xml <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>8.4.1.jre11</version> </dependency> ``` 然后,可以使用Java的JDBC API对SqlServer进行增删查改操作。下面是一个简单的示例代码: ```java import java.sql.*; public class SqlServerDemo { public static void main(String[] args) { Connection conn = null; try { // 连接SqlServer数据库 conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=test", "username", "password"); // 插入数据 String sql = "INSERT INTO student (id, name, age) VALUES (?, ?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 1); pstmt.setString(2, "Tom"); pstmt.setInt(3, 18); pstmt.executeUpdate(); // 查询数据 sql = "SELECT * FROM student WHERE id = ?"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 1); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { System.out.println(rs.getInt("id") + "\t" + rs.getString("name") + "\t" + rs.getInt("age")); } // 更新数据 sql = "UPDATE student SET age = ? WHERE id = ?"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 20); pstmt.setInt(2, 1); pstmt.executeUpdate(); // 删除数据 sql = "DELETE FROM student WHERE id = ?"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 1); pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } } ``` 其,`jdbc:sqlserver://localhost:1433;DatabaseName=test`示连接本地SqlServer数据库的test数据库,需要将username和password替换为实际的用户名和密码。代码演示了如何插入、查询、更新和删除数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值