SQL Server 通知 - 我的 OnChange 没有触发
Posted
技术标签:
【中文标题】SQL Server 通知 - 我的 OnChange 没有触发【英文标题】:SQL Server Notifications - My OnChange does not fire 【发布时间】:2009-12-15 00:20:57 【问题描述】:我想利用 SQL Server 通知在 winforms 应用程序中的数据库中捕获插入事件。我正在尝试使用 SQLDependency 对象。 MSDN 文章使这看起来非常简单。所以我创建了一个小示例应用程序来尝试一下。该事件似乎仅在我第一次进入我的应用程序时触发(出现消息框)。将数据插入表中不会引发看起来的 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!");
【问题讨论】:
你在哪里插入数据? SELECT 语句不是 INSERT。 我正在将数据插入到查询分析器中。很好地调用 INSERT 不是 SELECT :) Select 需要向数据库表明您正在查看哪些数据以获取通知。 请注意,我正在将该 SELECT 交给 SqlDendency 对象。 【参考方案1】:当我在执行查询通知时,我遇到了确切的问题。我检查了所有配置、代码片段,甚至 TCP 设置,但没有任何帮助。然后,我想出了在数据库上运行的以下查询,它解决了我的问题。也许你可以试试。
ALTER AUTHORIZATION ON DATABASE::[Your DB] TO sa;
【讨论】:
也为我工作。但我想了解这个查询做了什么。The proposed new database owner is already a user or aliased in the database.
【参考方案2】:
您的第一个通知是您收到的唯一通知。查询通知不是对更改的订阅,一旦触发通知,它也是无效的。您应该重新提交新的通知订阅。
如果您的查询立即得到通知,则意味着您没有收到更改通知,而是收到无效查询的通知。检查您收到的 SqlNotificationEventArgs 参数的值。检查Info 为插入/更新/删除,检查Source 为数据,检查Type 为更改。
查看Watcher Application 示例,以更好地了解您应该如何在收到通知时重新订阅。要更好地了解查询通知的工作原理,请参阅The Mysterious Notification。
【讨论】:
所以我的选择无效? info 属性具有“无效”。谢谢 我会看看你发送的这些链接! SELECt 本身对我来说似乎是有效的,但还有更多的标准。见msdn.microsoft.com/en-us/library/ms181122(SQL.90).aspx以上是关于SQL Server 通知 - 我的 OnChange 没有触发的主要内容,如果未能解决你的问题,请参考以下文章
SqlDependency通知sql server 2005不会在多个插入上触发
SqlDependency/Query 通知 - SQL Server 重新启动