使用SqlDependency类及利用SQL2008的Service Broker来检测数据改动的实现(二)

来源:互联网 发布:js number() 编辑:程序博客网 时间:2024/06/03 05:42

上一篇在控制台上实现,此篇在Winfoirm上实现


System.Data.SqlClient.SqlDependency类为我们提供了一个关于sql2005的很好的功能 ,就是sql2000时代很多人梦寐以求的查询自动通知。虽然这个东西限制有很多很多,但还是有很实用价值的。
我们先看一个演示例子:
例子中先创建一个sql环境,里面插入了一些数据,然后用.net客户端查询,查询结果出来后再去更改数据库,增加一些记录,同时查看.net客户端的表格是否变化。
1、创建sql测试环境

use mastergocreate database dbTestgouse   dbTestgocreate table test(id int identity(1,1),name varchar(10))insert into test(name)select 'aa'insert into test(name)select 'bb'insert into test(name)select 'cc'insert into test(name)select 'dd'insert into test(name)select 'ee'goalter database dbTest set enable_broker


2、在windows下用一个form和datagridview来测试2、在windows下用一个form和datagridview来测试2、在windows下用一个form和datagridview来测试

using System;using System.Data;using System.Windows.Forms;using System.Data.SqlClient;namespace WindowsApplication10{    public partial class Form1 : Form    {        //拖一个DataGridView到Form中        public Form1()        {            InitializeComponent();        }        //变量        string connString = "server=localhost;uid=sa;pwd=sqlgis;database=dbTest";        System.Data.SqlClient.SqlConnection conn = null;        System.Data.SqlClient.SqlCommand command = null;                //出示化        private void Form1_Load(object sender, EventArgs e)        {                        conn = new System.Data.SqlClient.SqlConnection(connString);            command = conn.CreateCommand();            command.CommandText = "select id,name from dbo.test where id<>4 order by id desc ";            SqlDependency.Start(connString);//启动                        GetData();//获取数据        }        private void GetData()        {            command.Notification = null;//清除            SqlDependency dependency = new SqlDependency(command);//设置通知            dependency.OnChange += new OnChangeEventHandler(sqlDependency_OnChange);//通知事件            using (SqlDataAdapter adapter =new SqlDataAdapter(command)) //查询数据            {                System.Data.DataSet ds = new DataSet();                adapter.Fill(ds,0,3, "test");                dataGridView1.DataSource = ds.Tables["test"];            }                    }        void sqlDependency_OnChange(object sender, SqlNotificationEventArgs e)        {            //因为是子线程,需要用invoke方法更新ui            if (this.InvokeRequired)            {                this.Invoke(new OnChangeEventHandler(sqlDependency_OnChange), new object[] { sender, e });            }            else            {                SqlDependency dependency = (SqlDependency)sender;                dependency.OnChange -= sqlDependency_OnChange;                //通知之后,当前dependency失效,需要重新getdata并且设置通知                GetData();            }        }        private void Form1_FormClosed(object sender, FormClosedEventArgs e)        {            //清理现场            SqlDependency.Stop(connString);            conn.Close();            conn.Dispose();        }    }}

3、启动.net程序,表格中会有3条记录,然后切换到数据库中,继续插入一些数据

4、切换回.net客户端,看看表格是否改变


关于SqlDependency类,很多人无法测试成功,因为它的限制很多,功能可能有待加强,稍微不注意就会让上面的代码陷入死循环。特别要注意的就是command的sql语句问题:

select id,name from dbo.test where id<>4 order by id desc

很遗憾,他只能支持上面这样的简单语句
列明必须写,不能用*,不能用top,不能用函数,包括聚合函数,不能用子查询,包括where后的子查询,不能用外连接,自连接,不能用临时表,不能用变量,不能用视图,不能垮库,而且表名之前必须加类似dbo这样的前缀....具体有多少限制,基本上除了上述的格式或者比上述更简单的格式,其他的都不可以。



insert into test(name)select 'ff'insert into test(name)select 'gg'


3、启动.net程序,表格中会有3条记录,然后切换到数据库中,继续插入一些数据3、启动.net程序,表格中会有3条记录,然后切换到数据库中,继续插入一些数据

 

0 0
原创粉丝点击