当某些表中的数据发生更改时,我使用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)如果“某人”更改数据非常快,该怎么办?有没有可能某些更改不会被通知?(我关心的是通知和我再次订阅之间的时间。
谢谢。
发布于 2012-10-25 16:43:41
About 1- query通知会通知你事情发生了变化。如果你想知道自上次以来发生了什么变化,你可以使用时间戳列。
关于2-查询通知通知您的更改,然后删除。然后,您再次订阅通知。丢弃和创建通知之间平均时间是不发送有关更改的通知的时间。
查询通知更多的是针对数据不经常更改的情况。例如-一些现金分类值。因此,您订阅某些表中的更改,等待更改,并在更改发生时获得最新版本的数据。应该考虑到查询通知也会使用服务器资源,所以如果您有很大的表,并且想要在一些小的数据子集上获得更改,那么许多查询可能会在性能方面受到影响(类似于索引视图)。
如果您需要根据更改的数据采取一些操作,并且每个更改都很重要,那么我猜触发器+服务代理可能会更有效。或者,根据您的需求,更改数据捕获。
https://stackoverflow.com/questions/13033362
复制相似问题