• 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这样的前缀....具体有多少限制,基本上除了上述的格式或者比上述更简单的格式,其他的都不可 以。

  • 相关阅读:
    如何删除PeopleSoft Process Definition
    你真的了解PeopleSoft中的function和method方法嘛
    PeopleCode事件和方法只用于online界面不能用于组件接口(component interface)
    Lucene.Net 3.0.3如何从TokenStream中获取token对象
    从零开始搭建一个简单的基于webpack的vue开发环境
    Vue路由懒加载
    减少打包组件vue.config.js——Webpack的externals的使用
    axios全局配置及拦截器
    vue-cli中eslint配置
    DDD领域驱动设计基本理论知识总结
  • 原文地址:https://www.cnblogs.com/zhwl/p/3148323.html
Copyright © 2020-2023  润新知