假设您有一个表单,其中包含一个显示SQL服务器视图数据的组件。该组件类似于ListView或DataGrid - 基本上可以以2D网格格式显示数据。另一个应用程序更改SQL视图描述的数据,并定期执行此操作但未定义的间隔。
问题在于:表单需要使用最新数据保持自身更新,并且更改和显示之间的延迟时间最短。
平台限制是您必须使用.NET 2.0和Microsoft的SQL Server。 假设您完全控制了该系统的所有其他部分,并且可以按照您想要的任何方式进行设计 - 最好的方法是什么?
到目前为止我想到的那些:
定期轮询数据并进行比较以查看更改内容。通过:
在SQL Server与表单和更新应用程序之间添加一个层,因此来自主应用程序的任何更新都会在此处进行,并且可以实时通知表单应用程序更改。不太确定在实践中如何做到这一点。
将触发器放在以某种方式导致表单通知的表上 - 可能会调用一些自定义扩展存储过程吗?
之前已经完成此操作的任何人,请提供您的见解!
如果您知道已经完成所有这些操作的现有库,请发表评论。
答案 0 :(得分:2)
一般来说,如果您希望自己的应用可以扩展,那么#2就是您想要的方式。查询通知通常不起作用,因为您必须保持对数据库的连接。
触发器是一个坏主意,因为数据库并不总是成为您所拥有模型的精确表示。 可能,但这不是必需的。
这就是为什么通过另一个层汇集您的更新是一个好主意,然后可以在模型更改时(以不需要持久连接和扩展的方式)发回通知。
您还可以通过让客户订阅他们想要的通知来减少流量,因此服务器最终不会向不关心的客户发送过多通知。
答案 1 :(得分:1)
在我们的小内部应用中,每当用户对数据库中的数据进行更改时,都会通过网络发送UDP广播,告诉每个人修改了哪种数据。如果用户的部分gui打开与广播的匹配,则重新加载他们打开的表单。
由于我们系统的用户打开相同的数据位并不常见,因此这不是一个过于常见的情况。我们确实会在有人查看他们打开的相同数据时发出警报 - 让他们知道可能导致他们正在查看的数据会发生什么变化。
答案 2 :(得分:0)
阅读查询通知。如果没有太多需要监控的查询或客户端,这可能是一个很好的解决方案。
答案 3 :(得分:0)
SQL Server确实提供通知客户端特定表的更新。根据发生的更新量,这可能是采取的方法。我认为它需要SQL 2005或更高版本,但我无法回想起。
如果您对源表有大量更新,那么您的第二个建议可能会有效。一种方法是利用WCF,并利用回调机制。该服务必须是单件或会话,但它会通过让每个客户端在打开代理时向其注册回调来跟踪客户端连接到哪个客户端。然后,您将让客户端通过服务提交更新,并作为更新事务中的最后一个操作到数据库,您将通过所有客户端进行服务循环并通知他们更新(我假设已更新)数据,所以你不要重新查询数据库)。这当然意味着中间层的额外负载,但它肯定可以工作。