3

当某些表中的数据发生更改时,我正在使用 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)如果“某人”非常快地更改数据怎么办。可能有些更改不会被通知?(我担心通知和再次订阅之间的时间。

谢谢你。

4

1 回答 1

3

关于 1- 查询通知会通知您某事已更改的事实。如果您想获取自上次以来发生的更改 - 您可能可以使用时间戳列。

关于 2- 查询通知会通知您有关更改,然后被删除。然后您再次订阅通知。删除和创建通知之间的时间是不发送有关更改的通知的时间。

查询通知更适用于数据不经常更改的情况。例如 - 一些兑现的分类值。因此,您订阅某些表中的更改,等待更改,并在它们发生时获得最新版本的数据。应该考虑到查询通知也使用服务器资源,所以如果你有很大的表并且想要对一些小的数据子集进行更改,很多查询可能会在性能方面受到影响(比如索引视图)。

如果您需要根据更改的数据采取一些措施并且每个更改都很重要,那么我猜触发器 + 服务代理可能会更有效。或者,根据您的需要,更改数据捕获。

于 2012-10-25T08:43:41.477 回答