我需要在用户输入数据库时立即向用户显示更新的数据,即在线视图。
我正在使用sql server并构建一个c#.net winform应用程序。 该应用程序将由3个用户U1,U2,U3在LAN上使用。
用户可以使用应用程序将数据输入到ITEMS表中,当U2单击插入按钮时,他应该在gridview底部的同一Form上查看更新的数据,否则,U1,U3也会在应用程序中自动查看其PC上的更新表。
我该怎么做?
U1,U2,U3已打开该应用程序。
U2已导航到INSERT项目表单。
U1,U3在视图项目表单上。
我希望当U2插入数据时,自动更新U1,U3应用程序上的网格视图,他们可以看到UEM在ITEMS表中插入的新数据。他们甚至不需要刷新或重新打开视图项Form。
必须在ITEMS表上使用触发器。有没有办法在这里避免触发?
答案 0 :(得分:3)
您不需要触发器(至少不是为了描述的目的)。
通常的做法是实现按需刷新功能(通常为F5)。
让PC或屏幕始终与数据库保持同步是有点荒谬的。考虑网络流量。当U1或U2接听电话,午餐或舒适休息时,请考虑没有人阅读屏幕。按需刷新功能更合理。
此外,如果必须实现此类函数,请将Last-Updated-TimeStamp或DateTime列添加到表中,并仅检索自上次检索以来已更新的行。
感谢。
在每个表格中,添加Timestamp
或Datetime
列,其名称类似于UpdatedDateTime
。设置默认值GETDATE()
。
每次更新行时都会更新此列。 请注意,您只能有意义地将一个数据窗口置于焦点,即。在前面,所有其他窗户都没有焦点,无法看到。因此,将刷新或自动刷新编码到每个窗口是没有意义的;只有那些实际需要自动刷新的窗口。
在客户端或.NET端,对于需要刷新的每个窗口,请编写Function-5按钮的代码。每当激活F5时,刷新窗口。这意味着:
SELECT column_list
FROM table t1
JOIN join_table t2 ...
WHERE t1.UpdatedDateTime > @SavedDateTime
OR t2.UpdatedDateTime > @SavedDateTime
... other_conditions
测试一下。确保手动刷新按预期工作。更新另一台PC上的数据,在此PC上按F5,并验证窗口中的数据是否发生变化以反映更新;并且当数据没有改变时,窗口现在重新绘制。
现在进行自动刷新。写一个无限循环(总是坏的新),等待30秒,并执行F5按钮代码。现在检查 是否按预期工作。
如果某个非常高级的人希望他们的窗口更频繁地刷新(超过30秒),请将等待参数更改为15秒。如果某个非常高级的人希望他们的窗口更频繁地刷新(超过15秒),请将等待参数更改为10秒。等等。切勿将等待时间设置为1或2或5秒。并允许每台PC设置自己的等待期(大老板5秒,小老板30秒)。
当老板对网络的速度很慢时,向他们展示当没有人坐在电脑前读取窗口时充斥网络的数据包,并建议他们关闭自动刷新。对于实际坐在窗前,手指没有折断的人来说,手动刷新仍然可以使用。
答案 1 :(得分:1)
您可以通过运行一个单独的线程来完成此操作,该线程将在一段时间后继续更新数据。
答案 2 :(得分:1)
我会考虑使用Event Notification/Service broker来通知客户任何数据更改。无需在客户端上进行轮询或刷新。
的博客上有更详细的信息