【发布时间】:2011-04-16 00:29:01
【问题描述】:
我有一个 C# winforms 应用程序,它有一个 datagridview 来显示 mySQL 数据库中表的内容。是否可以让 datagridview 实时反映对数据库的更改?即当我直接对表格进行更改时,它将在 datagridview 中显示更改
【问题讨论】:
标签: c# mysql winforms datagridview
我有一个 C# winforms 应用程序,它有一个 datagridview 来显示 mySQL 数据库中表的内容。是否可以让 datagridview 实时反映对数据库的更改?即当我直接对表格进行更改时,它将在 datagridview 中显示更改
【问题讨论】:
标签: c# mysql winforms datagridview
查看 BindingSource 和 INotifyPropertyChanged(针对您的对象)。
【讨论】:
简短的回答是否定的。您必须实现某种轮询机制。
如果此功能对您的应用程序非常重要,SQL Server 2008 R2 有一项称为StreamInsight 的技术,允许您在数据库级别观察数据流(甚至在它到达磁盘之前)并触发事件,理论上可以使用一种机制来触发应用程序中的更新。我相当肯定 MySQL 不包含类似的技术。
这些也只是“近乎实时的”。我猜你的意思是你希望数据网格在有新数据时更新,这不是实时的。
【讨论】:
理论上是可行的,但是非常笨拙,感觉不太适合使用数据库。一般来说,数据库是实时数据的重要来源。如果你想要实时数据,你应该使用实时推送数据源(有一大堆,主要针对财务数据)。
我已经使用更新触发器和本机存储过程实现了一个系统(在 SQL 服务器中,而不是 MySQL,但也许您可以这样做)。本机存储过程只是一个非托管代码 DLL,它实现了某个接口并且可以从 SQL 触发器中调用。
事件的先后顺序大致如下:
FileSystemWatcher 在文件系统上打开一个约定的文件(我们称之为“监视”文件),并在文件更改时设置回调。FileSystemWatcher 触发回调,之后我们知道数据已更改,因此我们从数据库中重新加载它。【讨论】:
这是可能的,是的,目前是可取的,可能不是。您正在寻找的技术称为“comet”,是一种服务器推送类型的架构。在网络应用程序中,这与当前支持的、可靠且易于维护的内容背道而驰。选项包括从浏览器运行网络服务器并进行回调和持久的 xmpp 对话,但除非您现在绝对需要这种行为,否则这些都不是真正有吸引力的。
HTML 5 与 web sockets 一起提供,这应该会使这种理想行为更容易获得,但可能需要几年时间才能获得广泛支持。
考虑使用 ajax 轮询 Web 服务并进行选择性的部分页面刷新,而不是实现真正的 http 推送架构。
【讨论】: