2012-10-23 91 views
3

我使用SqlDependency在某些表中的數據發生更改時獲取通知。SQLDependency + Service Broker

private void subscribeBroker() 
    { 
     using (var conn = new SqlConnection(connString)) 
     { 
      conn.Open(); 

      var cmd = new SqlCommand("SELECT text FROM dbo.Test"); 
      cmd.Connection = conn; 

      var dependency = new SqlDependency(cmd); 
      dependency.OnChange += dependency_OnChange; 
      SqlDependency.Start(connString); 

      cmd.ExecuteNonQuery(); 
     } 
    } 

    void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
    { 
     //Do something... 
     subscribeBroker(); 
    } 

它正在工作,但我有一些問題。

1)我沒有找到一個方法如何獲取信息哪一行被改變。我需要讀取整個表格中的所有數據,看看有什麼不同。有沒有辦法如何獲取這些信息? (主ID或其他)也許使用不同於SqlDependency的方法?

2)如果「某人」更改數據速度很快。有可能某些更改不會被通知? (我擔心的通知,當我再次訂閱它的時間之間的時間。

謝謝。如果你想獲得什麼

+0

關於1,如果您需要行信息,是否有阻止您從簡單地請求除了文本以外的ID? – tmesser

+0

不知道這應該如何幫助。比方說,測試表有樹行。當第二行被修改時,會引發dependency_OnChange,並且SqlCommand將返回沒有關於變化信息的樹行。 – Chatumbabub

回答

2

關於1-查詢通知,通知您擔心的是,有些事情是改變。自上次以來發生了更改 - 您可能使用時間戳列

關於2-查詢通知會通知您有關更改,然後將其刪除,然後您再次訂閱通知,即刪除和創建通知之間的平均時間爲那個時間在哪個通知中沒有發送變更。

當數據沒有頻繁變化時,查詢通知更適合這種情況。例如 - 一些兌現的分類值。因此,您可以訂閱某個表中的更改,等待更改,並在發生時獲得最新版本的數據。應該考慮到查詢通知也使用服務器資源,所以如果你有很大的表並想要在一些小的數據子集上進行更改,很多查詢會受到性能方面的影響(如索引視圖)。

如果您需要根據更改的數據採取某些操作,並且每次更改都很重要,那麼我會猜測觸發+服務代理可能更有效。或者,根據您的需要,更改數據捕獲。