[攒分贴] 用SqlDependency类为SQL2005查询提供更改通知
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
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();
}
}
}
insert into test(name)select 'ff'insert into test(name)select 'gg'