小编典典

SQLDependency +服务代理

sql

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

谢谢你。


阅读 211

收藏
2021-03-08

共1个答案

小编典典

关于1-查询通知会通知您有关事实,即某些更改。如果要获取自上次以来发生的更改,则可以使用timestamp列。

关于2-查询通知会通知您有关更改的信息,然后将其删除。然后您再次订阅通知。从删除到创建通知之间的时间就是不发送有关更改的通知的时间。

当数据不经常更改时,查询通知更适合这种情况。例如-
一些现金分类值。因此,您在某个表中订阅更改,等待更改,然后在发生更改时获得最新版本的数据。应该考虑到查询通知还使用服务器资源,因此,如果您的表很大,并且想对一些小的数据子集进行更改,那么很多查询的性能都会受到影响(例如索引视图)。

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

2021-03-08