2009-12-15 81 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