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