sqldependency类轮询功能
System.Data.SqlClient.SqlDependency类为我们提供了一个关于sql2005的很好的功能 ,虽然这个东西限制有很多很多,但还是有很实用价值的。
我们先看一个演示例子:
例子中先创建一个sql环境,里面插入了一些数据,然后用.net客户端查询,查询结果出来后再去更改数据库,增加一些记录,同时查看.net客户端的表格是否变化。
1、创建sql测试环境
- SQL code
-
use master gocreatedatabase dbTest gouse dbTest gocreatetable test(id intidentity(1,1),name varchar(10)) insertinto test(name)select'aa'insertinto test(name)select'bb'insertinto test(name)select'cc'insertinto test(name)select'dd'insertinto test(name)select'ee'goalterdatabase dbTest set enable_broker
2、在windows下用一个form和datagridview来测试
- C# code
-
using System; using System.Data; using System.Windows.Forms; using System.Data.SqlClient; namespace WindowsApplication10 { publicpartialclass 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; //出示化privatevoid 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();//获取数据 } privatevoid 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方法更新uiif (this.InvokeRequired) { this.Invoke(new OnChangeEventHandler(sqlDependency_OnChange), newobject[] { sender, e }); } else { SqlDependency dependency = (SqlDependency)sender; dependency.OnChange -= sqlDependency_OnChange; //通知之后,当前dependency失效,需要重新getdata并且设置通知 GetData(); } } privatevoid Form1_FormClosed(object sender, FormClosedEventArgs e) { //清理现场 SqlDependency.Stop(connString); conn.Close(); conn.Dispose(); } } }
3、启动.net程序,表格中会有3条记录,然后切换到数据库中,继续插入一些数据
- SQL code
-
insertinto test(name)select'ff'insertinto test(name)select'gg'
4、切换回.net客户端,看看表格是否改变
关于SqlDependency类,很多人无法测试成功,因为它的限制很多,功能可能有待加强,稍微不注意就会让上面的代码陷入死循环。特别要注意的就是command的sql语句问题:
select id,name from dbo.test where id <>4 order by id desc
很遗憾,他只能支持上面这样的简单语句
列
明必须写,不能用*,不能用top,不能用函数,包括聚合函数,不能用子查询,包括where后的子查询,不能用外连接,自连接,不能用临时表,不能用变
量,不能用视图,不能垮库,而且表名之前必须加类似dbo这样的前缀....具体有多少限制,基本上除了上述的格式或者比上述更简单的格式,其他的都不可
以。
分类:
c#
, 数据库SqlServer
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述