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 渠上月 閱讀(1867) 評論(0)  編輯  收藏 所屬分類: sql (sqlServer)
          主站蜘蛛池模板: 揭西县| 镇远县| 乃东县| 科技| 延长县| 即墨市| 和田市| 中超| 兴化市| 清原| 中卫市| 普兰县| 遂昌县| 内丘县| 遂溪县| 桐乡市| 和硕县| 景德镇市| 梁河县| 会同县| 虹口区| 剑河县| 乡宁县| 清远市| 镇远县| 姚安县| 综艺| 峨山| 友谊县| 金乡县| 田东县| 名山县| 苍溪县| 石门县| 柘城县| 宝丰县| 松江区| 萨迦县| 枝江市| 望江县| 时尚|