本文解释如何在 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;
回到顶端