【问题标题】:How to refresh the data on other user's interface when some user edits the data某些用户编辑数据时如何刷新其他用户界面上的数据
【发布时间】:2012-11-15 01:45:30
【问题描述】:

在一个 VB.net 应用程序中,我有一个 SQL 界面,我在 SQL 数据库中有一个 users 表供该应用程序的用户使用,现在当用户单击按钮时,所有用户都看到相同的数据,更改保存在为该用户刷新 sql 和数据,但是我希望在某些用户单击该按钮后立即为所有用户刷新数据。

我的想法

  1. 每秒刷新数据,这样不好
  2. vb.net 的 SQL 触发器,我需要更多说明!

最有效的方法是什么?

我想要一个没有计时器的工作!

谢谢

【问题讨论】:

  • 这是网络应用还是桌面应用?
  • 桌面应用,我正在使用 wpf 和普通网格控件

标签: sql wpf vb.net winforms sql-server-2008-r2


【解决方案1】:

罢工>

SQL Server 通知服务

SQL 提供对通知的订阅,这些通知提供与您的要求相关的机制。

http://msdn.microsoft.com/en-us/library/ms172483(v=sql.90).aspx

注意:删除,因为您后来提供了您正在使用 SQL Server 2008 R2 的信息

System.IO.FileSystemWatcher 的老把戏

另一种方法是在您的表上创建一个 SQL 触发器,该触发器执行简单的文件时间戳更改。文件本身的大小为 0 字节,因此我们不会向其写入任何内容,从而使其成为快速操作。

然后,所有客户端都会监视此文件以进行修改,并且当它发生时,监视程序会触发更改事件,您的客户端只需重新加载他们的数据。

CREATE TRIGGER DataChanged
ON YourTable
FOR INSERT, UPDATE, DELETE
AS
    EXEC master..xsp_UpdateSignalFile 'YourTable.DataChanged'

这个 CLR 存储过程的想法是尽可能快地保持它的可伸缩性。如果数据服务器负载很重,甚至可以通过使用外部进程更新文件来优化...

您可以在this MSDN article 中找到 CLR 存储过程的代码,该代码实际上与 Web 表单相关,但您不需要除此 CLR 过程之外的其他东西。或许还有对整个系统如何运作的解释。

然后,您的客户将使用System.IO.FileSystemWatcher 来监视某个网络位置(程序将在该位置更新文件)上的文件更改,并在更改发生时更新其数据。

简单而优雅的技巧,不使用轮询或对数据服务器的不必要请求。当然,您可以在多个表上设置触发器,每个表更改不同的文件,并根据您在客户端上显示的表单,然后在表单的整个生命周期内查看该特定文件。当用户将上下文更改为不同的数据时,您的客户端应用程序会释放文件观察器(并为不同的文件创建一个新的所需的观察器)。

【讨论】:

  • SQL Server 2008 不再支持 SQL Server 通知服务,我不会问 ;)
  • @user1590636:当我开始写我的答案时,你还没有提供 SQL 版本。另一方面,第二种解决方案很优雅,应该在您的场景中运行良好。
  • @RobertKoritnik 记录每个登录应用程序的用户的 ip 怎么样,当用户单击保存更改按钮时,一条消息会发送到所有通过 TCP/IP 运行应用程序的计算机,然后我查看消息并调用刷新函数,这样好吗?
  • @user1590636:我认为你会用那个解决方案追逐自己的尾巴,因为如果你将用户存储在某个地方(即数据库),那么你每次都必须读取该数据您将进行数据库更改以通知当前登录的用户。或者再次进行轮询以更新内存中的用户列表。我认为这不是一个好的解决方案,因为您不必关注一项更改,而是必须关注另一项更改并通知客户。这也意味着与这个​​简单的 CLR SP 相比,您必须自己开发一个更复杂的更新系统并使用开箱即用的系统类。
【解决方案2】:

简单,

你不能那样做。你的浏览器只提取一次数据,除了一些像 cookie 这样的东西,你的浏览器不会记住任何东西。

您唯一的选择是每 5 或 10 秒左右刷新一次页面。这只能使用 javascript 来完成。幸运的是,Visual Studio 为您提供了某种 javascript。这将阻止浏览器刷新。所以你不会每 5 秒听到一次咔哒声。

在要刷新的控件周围添加一个更新面板。 然后添加一个回发触发器并将其设置为 5000 毫秒。

添加到“页面加载”-->重新调整您的控件。

更好的方法是添加一个只会向您发送数据但以上工作正常且易于实施的网络方法。

祝你好运。

【讨论】:

  • 好吧,您不必重新加载所有数据。只有更改的数据...这可以使用存储更新的表(由 sql 触发器填充)来完成。
  • @Kek 我已经只加载了更改的数据,但我正在寻找没有计时器的解决方案!
  • @Danny 它不是网络应用程序 :)
  • 即使这是一个 Web 应用程序,这也不是一个有效的答案......如今,轮询并不是唯一可能的解决方案......检查反应式扩展。
【解决方案3】:

我猜这是一个 Windows 窗体应用程序,而不是一个 aspx Web 应用程序?我建议在某种用户提出的事件上重新加载表单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多