SQLDependency + Service Broker

时间:2012-10-23 14:58:08

标签: c# sql sql-server service-broker sqldependency

我正在使用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 个答案:

答案 0 :(得分:3)

关于1-查询通知会告知您事情已发生变化。如果你想获得自上次以来改变的内容 - 你可以使用timestamp列。

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

当您的数据不经常更改时,查询通知更适用于这种情况。例如 - 一些兑现的分类值。所以你订阅了某些表中的更改,等待更改,并在它们发生时获得最新版本的数据。应该考虑查询通知也使用服务器资源,所以如果你有一个庞大的表并希望对一小部分数据进行更改,那么很多查询都会受到性能影响(比如索引视图)。

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