sqldependency类轮询功能
System.Data.SqlClient.SqlDependency类为我们提供了一个关于sql2005的很好的功能 ,虽然这个东西限制有很多很多,但还是有很实用价值的。
我们先看一个演示例子:
例子中先创建一个sql环境,里面插入了一些数据,然后用.net客户端查询,查询结果出来后再去更改数据库,增加一些记录,同时查看.net客户端的表格是否变化。
1、创建sql测试环境
- SQL code
-
use master
gocreatedatabase dbTest
gouse dbTest
))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,, "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这样的前缀....具体有多少限制,基本上除了上述的格式或者比上述更简单的格式,其他的都不可
以。
sqldependency类轮询功能的更多相关文章
- 利用nginx自带的反向代理以及轮询功能实现应用的负载均衡
针对中间件部署的应用(war包),可使用nginx自带的反向代理以及轮询功能,实现应用的负载均衡. 一.架构图 二.环境准备 准备2套环境,如19.1.0.18:7001,19.1.0.16:7001 ...
- WPF非轮询方式更新数据库变化SqlDependency(数据库修改前台自动更新)
上一章节我们讲到wpf的柱状图组件,它包含了非轮询方式更新数据库变化SqlDependency的内容,但是没有详细解释,现在给大家一个比较简单的例子来说明这部分内容. 上一章节: WPF柱状图(支持数 ...
- VS2013自带的Browser Link功能引发浏览localhost网站时不停的轮询
浏览localhost网站时候不管你打开那个页面它都会不停的轮询.据悉这是VS2013自带的Browser Link功能,里面用到SignalR机制 什么是Browser Link功能,什么是Sign ...
- 使用Ajax轮询模拟简单的站内信箱(消息管理)功能
前一段时间项目需要写一个类似于站内信箱的消息管理的功能,由于对前端不是很熟悉,刚开始不知道怎么做,后来看了网上的方案,现模拟一个非常简单的消息管理. 我们首先看一下最终效果的样式,就是非常简单的一个样 ...
- 基于PHP实现一个简单的在线聊天功能(轮询ajax )
基于PHP实现一个简单的在线聊天功能(轮询ajax ) 一.总结 1.用的轮询ajax 二.基于PHP实现一个简单的在线聊天功能 一直很想试着做一做这个有意思的功能,感觉复杂的不是数据交互和表结构,麻 ...
- [置顶] Android AlarmManager实现不间断轮询服务
在消息的获取上是选择轮询还是推送得根据实际的业务需要来技术选型,例如对消息实时性比较高的需求,比如微博新通知或新闻等那就最好是用推送了.但如果只是一般的消息检测比如更新检查,可能是半个小时或一个小时一 ...
- Android AlarmManager实现不间断轮询服务
在消息的获取上是选择 轮询还是推送得根据实际的业务需要来技术选型,例如对消息实时性比较高的需求,比如微博新通知或新闻等那就最好是用推送了.但如果只是一般的消息检测比如 更新检查,可能是半个小时或一个小 ...
- polling轮询和comet
comet:(原意:彗星) Comet is a web application model in which a long-held(held:保留) HTTP request allows a w ...
- Nginx 负载均衡-加权轮询策略剖析
本文介绍的是客户端请求在多个后端服务器之间的均衡,注意与客户端请求在多个nginx进程之间的均衡相区别(Nginx根据每个工作进程的当前压力调整它们获取监听套接口的几率,那些当前比较空闲的工作进程有更 ...
随机推荐
- 关于逆元&&lucas定理
lucas是求组合数C(m,n)%p,有一个公式:C(m,n) = C(m/p,n/p)*C(m%p,n%p). (a*b)%c==a%c*b%c,但是(a/b)%c!=a%c/b%c,所以我们要算b ...
- Java 8 实战 P3 Effective Java 8 programming
目录 Chapter 8. Refactoring, testing, and debugging Chapter 9. Default methods Chapter 10. Using Optio ...
- HDU1043 Eight
题目: 简单介绍一下八数码问题: 在一个3×3的九宫格上,填有1~8八个数字,空余一个位置,例如下图: 1 2 3 4 5 6 7 8 在上图中,由于右下角位置是空的 ...
- RabbitMQ .NET消息队列使用入门(一)【简单示例】
首先下载安装包,我都环境是win7 64位: 去官网下载 otp_win64_19.0.exe 和rabbitmq-server-3.6.3.exe安装好 然后开始编程了: (1)创建生产者类: cl ...
- 同域之下子iframe的DOM控制问题
new_file.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- 复习java基础第七天(反射)
一:目标 Ø理解 Class 类 Ø理解 Java 的类加载机制 Ø学会使用 ClassLoader 进行类加载 Ø理解反射的机制 Ø掌握 Constructor.Method.Field 类的用法 ...
- js判断数组中是否包含某个值
/** * 判断数组中是否包含某个值 * @param arr 数组 * @param str 值 * @returns {boolean} */ function contains(arr, str ...
- 5G vs AI谁更有前途?
5G vs AI谁更有前途? 5G通信技术和AI人工智能技术是两个不同层面的技术领域,而它们两者都将在未来20年内对世界的发展有着革命性和里程碑式的影响.未来5G和AI谁更有前途呢? 5G技术的发展和 ...
- Android内存优化————加载长图
项目中总会遇到加载长图的需求,图片的长度可能是手机长度的很多倍,也就是需要通过滑动来查看图片.比较简单的实现方式就是使用ScrollView来加载长图,但是这样做有一个很严重的问题,就是内存消耗严重. ...
- BZOJ : [Usaco2013 Nov]Crowded 单调队列
正反两遍个来一次单调队列 DP 即可. Code: #include<cstdio> #include<deque> #include<algorithm> usi ...