blog.Toby

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  130 随笔 :: 2 文章 :: 150 评论 :: 0 Trackbacks
作者  Balamurali Balaji MVP
注意:这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责。
文章编号 : 555893
最后修改 : 2007年3月27日
修订 : 1.0

概要

本文解释如何在 C# 窗口应用程序中实现 SQL SERVER 2005 查询通知服务。 本文中提供示例代码与 Visual Studio 2005 和 SQL Server Management Studio 2005。

回到顶端

症状

简介

查询通知是功能允许应用程序要数据已更改时通知 Microsoft SQL Server 2005 中。 它主要用于存储数据库中数据的缓存并获取刷新并通知客户应用 everytime 中数据库中数据更改应用程序。

ASP.NET 2.0 中开发已经熟悉自己 Web 应用程序以 SQL 数据缓冲区中 < A0 > SqlCacheDependency < / A0 > 类使用。 如由 System.Data.SqlClient 命名空间中 SqlDependency 类提供本文处理高级实现。 它提供之间窗口应用程序和 SQLServer, 使您可以使用相关性来检测服务器中更改简单和一流通知功能。 它有效地利用 SQL Server 2005 通知功能对托管客户应用程序使用 ADO.NET。

SQL Server 2005 使 ADO.NET Windows 应用程序可以向 SQLServer 发送命令, 请求生成通知如果执行同一 SQL 命令将生成结果集与最初检索不同。 查询通知是受数据库 Service Broker 事件和队列机制。

回到顶端

原因

中实现查询通知 step-By-Step 方法 的整个过程是接收请求通知进程之间客户窗口应用程序和 SQL Server 2005 是五个小步骤中完成如下:

1) 数据库是问题必须配置为启用查询通知服务。

出于安全原因, SQL Server 2005 数据库没有默认启用 ServiceBroker。 要启用查询通知对数据库, SQL SERVER 2005 MAnagement VisualStudio, 查询窗口, 中运行以下命令:

ALTER DATABASE SET ENABLE_BROKER;

我在本文, 使用 AdvtDB 名

ALTER DATABASE AdvtDB SET ENABLE_BROKER;

2) 用户必须具有正确客户和服务器端权限来请求并接收通知。
谁执行请求通知必须具有 SUBSCRIBEQUERYNOTIFICATIONS 数据库权限对端 server.Client - 代码部分信任情况中运行命令用户要求 SqlClientPermission。



专用 bool EnoughPermission()
{
        
SqlClientPermission perm = 新 SqlClientPermission.System.Security.permissions.PermissionState.unrestricted;)
   尝试
   {
       perm.demand();
       返回 true ;
   } 
   catch (System.Exception)
   {
       返回 false ;
   }
}

3) 使用 SqlCommand 对象来执行与一个关联通知 objectùSqlDependency 有效 SELECT 语句。


SqlDependency 对象 : 查询通知 API 提供 SqlDependency 对象来处理通知。 使用 SqlDependency, ServiceBroker 对象, 例如通知队列, 预定义。 它与它们发布到队列自动启动辅助线程以处理通知 ; 它还分析 ServiceBroker 消息, 公开信息作为事件参数数据。 必须通过调用开始方法来建立相关性到数据库初始化 SqlDependency。 这是静态方法需要为每个数据库连接需要应用初始化期间调用一次。 对于每个依赖连接进行应用程序终止上应调用 Stop 方法。

建立数据库连接、 SqlDependency 收听通知服务已启动并 DataGridView 控件显示与当前结果返回由命令对象执行查询 Click 的按钮, 上。


        专用 void button1_Click(object sender, EventArgs e)
        {

            / / 删除任何现有相关性连接, 然后创建一个新的。
            connstr = 数据源 " IntegratedSecurity; 初始目录 " = localhost; = SSPI ; = AdvtDB;
            字符串 ssql = 选择 " 从 advt; * "

            SqlDependency.Stop(connstr);
            SqlDependency.start(connstr);
            如果 () 连接 = = null
                连接 = 新 SqlConnection(connstr);
            如果 () 命令 = = null
                命令 = 新 SqlCommand ssql, 连接);
            如果 () myDataSet = = null
                myDataSet = 新 DataSet();
            GetAdvtData();
        }

GetAdvtData() 是 Helper 函数创建命令对象实例, 将其与 SqlDependency 对象关联。 注意 SqlDependency 对象有 OnChange 事件通知客户数据库中已进行更改并将负责其 eventhandler dependency_OnChange 的接收部分的通知。

        专用 void GetAdvtData()
        {
            myDataSet.clear();
            / / 确保命令对象没有通知对象。
            command.Notification = null;
            / / 创建并绑定到命令对象 SqlDependency 对象。
            SqlDependency 相关性 = 新 SqlDependency(command);
            dependency.OnChange += 新 OnChangeEventHandler(dependency_OnChange);

            使用 (SqlDataAdapter 适配器 = 新 SqlDataAdapter(command))
            {
                adapter.Fill (myDataSet, " Advt ");
                dataGridView1.DataSource = myDataSet;
                dataGridView1.DataMember = " advt ";
            }
        }

4) 提供代码以处理通知时而且被监视数据更改。

辅助线程进程封装 OnChange 事件处理程序并且因此, UI changes(updating the datagrid, displaying the status message) 位于主线程不可能访问此处。 创建另一个委托线程 UIDelegate 执行这些任务并让
从 OnChange 事件的 SqlDependency 对象删除辅助线程只处理程序。

       委派 void UIDelegate();
       专用 void dependency_OnChange (object sender, SqlNotificationEventArgs e)
        {
            UIDelegate uidel = 新 UIDelegate(RefreshData);
            This.invoke (uidel, null);

            //Remove 情形处理程序用于将一个通知。
            SqlDependency 相关性 = (SqlDependency) 发送者;
            dependency.OnChange -= dependency_OnChange;
        }
        专用 void RefreshData()
        {
            / / 由于, UI 线程上执行代码可以安全地更新 UI。

            label1.Text = " 数据库有一些更改和网格中应用 ";

            / / 加载数据集绑定到网格。
            GetAdvtData();
        }

5) 停止 SqlDependency NotificationServices 退出 application.In form_closing 事件时, 包含用于停止 SqlDepenency 通知侦听器服务代码。


        专用 void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            SqlDependency.Stop(connstr);
            如果 () 连接 = null !
                Connection.Close();
        }

下面是声明该程序中使用。

        专用 const 字符串 statusMessage; 
        专用 DataSet myDataSet = null;
        专用 SqlConnection 连接 = null;
        专用 SqlCommand 命令 = null;
        私有字符串 connstr;



回到顶端

解决方案

测试应用程序
运行刚刚按照上述步骤创建 VisualC # Windows 应用程序。 当窗体显示, "-单击该按钮并注意 datagridview 控件被填充。

现在, 打开查询窗口是 SQL Server Management 画室式, 和插入行或更新关注表中列。 切换回您运行应用程序, C# 时可能看到数据网格视图中出现更改。
posted on 2007-08-15 10:08 渠上月 阅读(1843) 评论(0)  编辑  收藏 所属分类: sql (sqlServer)

只有注册用户登录后才能发表评论。


网站导航: