我正在使用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)如果“某人”非常快地改变数据怎么办?某些更改可能不会被通知? (我很关心通知和再次订阅时间之间的时间。
谢谢。
答案 0 :(得分:3)
关于1-查询通知会告知您事情已发生变化。如果你想获得自上次以来改变的内容 - 你可以使用timestamp列。
关于2-查询通知会通知您有关更改,然后被删除。然后你再次订阅通知。删除和创建通知之间的平均时间是不发送有关更改的通知的时间。
当您的数据不经常更改时,查询通知更适用于这种情况。例如 - 一些兑现的分类值。所以你订阅了某些表中的更改,等待更改,并在它们发生时获得最新版本的数据。应该考虑查询通知也使用服务器资源,所以如果你有一个庞大的表并希望对一小部分数据进行更改,那么很多查询都会受到性能影响(比如索引视图)。
如果您需要根据已更改的数据采取某些操作,并且每项更改都很重要,那么我猜测触发器+服务代理可能会更有效。或者,根据您的需要,更改数据捕获。