2009-12-15 80 views
4

我想利用SQL Server通知在Winforms應用程序中的數據庫中捕獲插入事件。我正在嘗試使用SQLDependency對象。 MSDN文章使這看起來非常簡單。所以我創建了一個小示例應用程序來嘗試一下。當我第一次進入我的應用程序(MessageBox出現)時,事件似乎只會發生。將數據插入表中並不會引發看起來像的OnChange事件。有人能告訴我我錯過了什麼嗎?謝謝!SQL Server通知 - 我的OnChange不會觸發

public Main() 
    { 
     InitializeComponent(); 
     var check = EnoughPermission(); 
     SqlDependency.Stop(constr); 
     SqlDependency.Start(constr); 
     if(connection == null) 
     { 
      connection = new SqlConnection(constr); 
     } 
     if(command == null) 
     { 
      command = new SqlCommand("Select ID, ChatMessage FROM dbo.Chat",connection); 
     } 
     connection.Open(); 
     command.Notification = null; 
     SqlDependency dependency = new SqlDependency(command); 
     dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 
     command.ExecuteReader(); 
    } 





    private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
    { 
     MessageBox.Show("Change!"); 
    } 
+0

你在哪裏插入數據?一個SELECT語句不是一個INSERT。 – 2009-12-15 00:24:23

+0

我將數據插入到查詢分析器中。對插入的良好調用不是SELECT選擇:)需要選擇以向數據庫表示正在監視通知的數據。 – Nick 2009-12-15 00:27:45

+0

請注意,我將該SELECT交給SqlDendency對象。 – Nick 2009-12-15 00:28:58

回答

6

您的第一個通知是您將獲得的唯一通知。查詢通知不是訂閱更改,一旦通知被觸發,它也是無效的。您應該重新提交新的通知訂閱。

如果您的查詢得到了immedeatly的通知,這意味着您沒有收到有關更改的通知,而是針對無效查詢。檢查您收到的SqlNotificationEventArgs參數的值。檢查Info爲插入/更新/刪除,檢查Source爲數據,檢查Type爲更改。

查看Watcher Application示例,以更好地瞭解在通知您時應如何重新訂閱。要更好地瞭解查詢通知的工作方式,請參見The Mysterious Notification

+0

因此,我的選擇無效? info屬性有'無效'。謝謝我看看你發送的這些鏈接! – Nick 2009-12-15 00:54:24

+0

SELECt本身看起來對我來說是有效的,但是有一些mirriad更多的標準。見http://msdn.microsoft.com/en-us/library/ms181122(SQL.90).aspx – 2009-12-15 01:01:27

11

當我在執行查詢通知時,我遇到了確切的問題。我檢查了所有配置,代碼段,甚至TCP設置,但沒有任何幫助。然後,我想出了下面的查詢在數據庫上運行,它解決了我的問題。也許你可以嘗試一下。

ALTER AUTHORIZATION ON DATABASE::[Your DB] TO sa; 
+0

非常感謝,先生,這真的解決了我的問題。 – 2013-02-28 10:29:19

+3

也爲我工作。但我想知道這個查詢做了什麼。 – bussa 2015-04-20 11:11:36

+0

'建議的新數據庫所有者已經是數據庫中的用戶或別名.' – 2017-05-15 10:27:27