当某些表中的数据更改时,我正在使用SqlDependency来获取通知。
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)如果“某人”非常快地更改数据该怎么办。某些更改可能不会得到通知吗?(我担心通知和再次订阅之间的时间。
谢谢你。
关于1-查询通知会通知您有关事实,即某些更改。如果要获取自上次以来发生的更改,则可以使用timestamp列。
关于2-查询通知会通知您有关更改的信息,然后将其删除。然后您再次订阅通知。从删除到创建通知之间的时间就是不发送有关更改的通知的时间。
当数据不经常更改时,查询通知更适合这种情况。例如- 一些现金分类值。因此,您在某个表中订阅更改,等待更改,然后在发生更改时获得最新版本的数据。应该考虑到查询通知还使用服务器资源,因此,如果您的表很大,并且想对一些小的数据子集进行更改,那么很多查询的性能都会受到影响(例如索引视图)。
如果您需要根据更改的数据采取某些措施,并且每个更改都很重要,那么我猜触发器+服务代理可能会更有效。或者,根据您的需要,更改数据捕获。