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根据每个工作进程的当前压力调整它们获取监听套接口的几率,那些当前比较空闲的工作进程有更 ...
随机推荐
- Codeforces--629B--Far Relative’s Problem(模拟)
Far Relative's Problem Time Limit: 2000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I ...
- PCB MS SQL SERVER版本管控工具source_safe_for_sql_server
PCB由于业务关系复杂,业务触发一个事件时,可能需与数据库多个表进行关连处理才能拿到数据结果, 而表关连并不是简单的关连,实际是要进行大量数据筛选,逻辑判断,转换等过程...这个过程是复杂的 想一想, ...
- JavaScript中变速运动的数学模型构建
AB两地直线距离相距为S,机器人β从A点向B点行进.已知机器人β的每间隔固定时间行进一段路程,其下次行进的距离为当前距离B点路程的1/q(q为正整数),求机器人第n次行进距离的表达式an以及前n项和公 ...
- 辨析 singleton 和 prototype
<bean id="person1" class="com.bean.life.Person"> <property name="n ...
- RPC与REST
RPC与REST (摘自网络,个人理解)
- 文件的上传(可以上传照片,word文档,等单个文件)
jsp: jsp页面: <LINK href="${basePath}plugins/uploadify/uploadify.css" type="text/css ...
- ThinkPHP3.2.3对数据的添、删、改、查(CURD)
对数据的添加: public function form() { parent::common(); $obj = D('Leave'); if (IS_POST) { $data = I('post ...
- js弹出层的写法实例
点击后弹出界面,通过判断浏览器长宽自动设定页面宽度和登陆页面位置. <style> /*遮罩层 弹出层*/ .mask { width: 100%; background-color: r ...
- jQuery+pjax简单示例汇总
pjax 是一个jQuery插件,它使用 ajax 和 pushState 来实现快速的浏览体验,包括真正的固定链接,页面标题和工作返回按钮. ajax缺点是破坏了浏览器的前进后退,因为ajax的请求 ...
- luogu P1856 [USACO5.5]矩形周长Picture 扫描线 + 线段树
Code: #include<bits/stdc++.h> #define maxn 200007 #define inf 100005 using namespace std; void ...