2012-10-23 93 views
3

我使用SqlDependency在某些表中的数据发生更改时获取通知。SQLDependency + Service Broker

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

关于1,如果您需要行信息,是否有阻止您从简单地请求除了文本以外的ID? – tmesser

+0

不知道这应该如何帮助。比方说,测试表有树行。当第二行被修改时,会引发dependency_OnChange,并且SqlCommand将返回没有关于变化信息的树行。 – Chatumbabub

回答

2

关于1-查询通知,通知您担心的是,有些事情是改变。自上次以来发生了更改 - 您可能使用时间戳列

关于2-查询通知会通知您有关更改,然后将其删除,然后您再次订阅通知,即删除和创建通知之间的平均时间为那个时间在哪个通知中没有发送变更。

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

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