文章编号: 555893 - 最后修改: 2007年3月27日 - 修订: 1.0

C# Windows 应用程序中实现 SQL Server 2005 查询通知

作者?Balamurali Balaji MVP
展开全部 | 关闭全部

概要

本文解释如何在 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# 时可能看到数据网格视图中出现更改。


更多信息

摘要
?
SQL Server 2005 Brokerage 服务结合 ADO.NET 查询通知对象提供您一个有效种通知用户应用程序中数据库中更改。 以下 URL 上可获得详细信息: http://msdn2.microsoft.com/en-us/library/system.data.sql.sqlnotificationrequest.aspx

这篇文章中的信息适用于:
  • Microsoft SQL Server Notification Services 2.0
  • Microsoft Visual C# .NET 2003 Standard Edition
关键字:?
kbpubmvp kbpubtypecca kbhowto KB555893 KbMtzh kbmt
机器翻译机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。如果您发现了错误并希望帮助我们提高机器翻译技术,请完成文章末尾的在线调查。
点击这里察看该文章的英文版: 555893? (http://support.microsoft.com/kb/555893/en-us/ )
Community Solutions Content社区解决方案内容免责声明
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的或衍生性的损失或任何种类的损失,均不负任何责任,无论该等诉讼是合同之诉、疏忽或其它侵权行为之诉。
 

文章翻译