簡介 查詢通知是功能允許應(yīng)用程序要數(shù)據(jù)已更改時通知 Microsoft SQL Server 2005 中。 它主要用于存儲數(shù)據(jù)庫中數(shù)據(jù)的緩存并獲取刷新并通知客戶應(yīng)用 everytime 中數(shù)據(jù)庫中數(shù)據(jù)更改應(yīng)用程序。
ASP.NET 2.0 中開發(fā)已經(jīng)熟悉自己 Web 應(yīng)用程序以 SQL 數(shù)據(jù)緩沖區(qū)中 < A0 > SqlCacheDependency < / A0 > 類使用。 如由 System.Data.SqlClient 命名空間中 SqlDependency 類提供本文處理高級實現(xiàn)。 它提供之間窗口應(yīng)用程序和 SQLServer, 使您可以使用相關(guān)性來檢測服務(wù)器中更改簡單和一流通知功能。 它有效地利用 SQL Server 2005 通知功能對托管客戶應(yīng)用程序使用 ADO.NET。
SQL Server 2005 使 ADO.NET Windows 應(yīng)用程序可以向 SQLServer 發(fā)送命令, 請求生成通知如果執(zhí)行同一 SQL 命令將生成結(jié)果集與最初檢索不同。 查詢通知是受數(shù)據(jù)庫 Service Broker 事件和隊列機制。
回到頂端
中實現(xiàn)查詢通知 step-By-Step 方法 的整個過程是接收請求通知進程之間客戶窗口應(yīng)用程序和 SQL Server 2005 是五個小步驟中完成如下:
1) 數(shù)據(jù)庫是問題必須配置為啟用查詢通知服務(wù)。
出于安全原因, SQL Server 2005 數(shù)據(jù)庫沒有默認啟用 ServiceBroker。 要啟用查詢通知對數(shù)據(jù)庫, SQL SERVER 2005 MAnagement VisualStudio, 查詢窗口, 中運行以下命令:
ALTER DATABASE SET ENABLE_BROKER;
我在本文, 使用 AdvtDB 名
ALTER DATABASE AdvtDB SET ENABLE_BROKER;
2) 用戶必須具有正確客戶和服務(wù)器端權(quán)限來請求并接收通知。
誰執(zhí)行請求通知必須具有 SUBSCRIBEQUERYNOTIFICATIONS 數(shù)據(jù)庫權(quán)限對端 server.Client - 代碼部分信任情況中運行命令用戶要求 SqlClientPermission。
專用 bool EnoughPermission()
{
SqlClientPermission perm = 新 SqlClientPermission.System.Security.permissions.PermissionState.unrestricted;)
嘗試
{
perm.demand();
返回 true ;
}
catch (System.Exception)
{
返回 false ;
}
}
3) 使用 SqlCommand 對象來執(zhí)行與一個關(guān)聯(lián)通知 objectùSqlDependency 有效 SELECT 語句。
SqlDependency 對象 : 查詢通知 API 提供 SqlDependency 對象來處理通知。 使用 SqlDependency, ServiceBroker 對象, 例如通知隊列, 預(yù)定義。 它與它們發(fā)布到隊列自動啟動輔助線程以處理通知 ; 它還分析 ServiceBroker 消息, 公開信息作為事件參數(shù)數(shù)據(jù)。 必須通過調(diào)用開始方法來建立相關(guān)性到數(shù)據(jù)庫初始化 SqlDependency。 這是靜態(tài)方法需要為每個數(shù)據(jù)庫連接需要應(yīng)用初始化期間調(diào)用一次。 對于每個依賴連接進行應(yīng)用程序終止上應(yīng)調(diào)用 Stop 方法。
建立數(shù)據(jù)庫連接、 SqlDependency 收聽通知服務(wù)已啟動并 DataGridView 控件顯示與當前結(jié)果返回由命令對象執(zhí)行查詢 Click 的按鈕, 上。
專用 void button1_Click(object sender, EventArgs e)
{
/ / 刪除任何現(xiàn)有相關(guān)性連接, 然后創(chuàng)建一個新的。
connstr = 數(shù)據(jù)源 " 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 函數(shù)創(chuàng)建命令對象實例, 將其與 SqlDependency 對象關(guān)聯(lián)。 注意 SqlDependency 對象有 OnChange 事件通知客戶數(shù)據(jù)庫中已進行更改并將負責(zé)其 eventhandler dependency_OnChange 的接收部分的通知。
專用 void GetAdvtData()
{
myDataSet.clear();
/ / 確保命令對象沒有通知對象。
command.Notification = null;
/ / 創(chuàng)建并綁定到命令對象 SqlDependency 對象。
SqlDependency 相關(guān)性 = 新 SqlDependency(command);
dependency.OnChange += 新 OnChangeEventHandler(dependency_OnChange);
使用 (SqlDataAdapter 適配器 = 新 SqlDataAdapter(command))
{
adapter.Fill (myDataSet, " Advt ");
dataGridView1.DataSource = myDataSet;
dataGridView1.DataMember = " advt ";
}
}
4) 提供代碼以處理通知時而且被監(jiān)視數(shù)據(jù)更改。
輔助線程進程封裝 OnChange 事件處理程序并且因此, UI changes(updating the datagrid, displaying the status message) 位于主線程不可能訪問此處。 創(chuàng)建另一個委托線程 UIDelegate 執(zhí)行這些任務(wù)并讓
從 OnChange 事件的 SqlDependency 對象刪除輔助線程只處理程序。
委派 void UIDelegate();
專用 void dependency_OnChange (object sender, SqlNotificationEventArgs e)
{
UIDelegate uidel = 新 UIDelegate(RefreshData);
This.invoke (uidel, null);
//Remove 情形處理程序用于將一個通知。
SqlDependency 相關(guān)性 = (SqlDependency) 發(fā)送者;
dependency.OnChange -= dependency_OnChange;
}
專用 void RefreshData()
{
/ / 由于, UI 線程上執(zhí)行代碼可以安全地更新 UI。
label1.Text = " 數(shù)據(jù)庫有一些更改和網(wǎng)格中應(yīng)用 ";
/ / 加載數(shù)據(jù)集綁定到網(wǎng)格。
GetAdvtData();
}
5) 停止 SqlDependency NotificationServices 退出 application.In form_closing 事件時, 包含用于停止 SqlDepenency 通知偵聽器服務(wù)代碼。
專用 void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
SqlDependency.Stop(connstr);
如果 () 連接 = null !
Connection.Close();
}
下面是聲明該程序中使用。
專用 const 字符串 statusMessage;
專用 DataSet myDataSet = null;
專用 SqlConnection 連接 = null;
專用 SqlCommand 命令 = null;
私有字符串 connstr;
回到頂端