C# DGV - 显示实时 MYSQL 数据库表

标签 c# mysql data-binding datagridview

我有一个场景,我有多个用户(一次大约 50 个)连接到一个表,所有这些用户都不断地对已经存在的行进行更改。我需要做的是以某种方式始终显示数据库的实时 View 。

拥有表的缓存副本不是一个有效的选择,因为所有用户都需要立即看到所有更改。

当我第一次加载我正在使用的数据库时

mydtadp = new MySqlDataAdapter();
bindingSource1 = new BindingSource();
table = new DataTable();
MySqlConnection MyConn = new MySqlConnection(MyConnection);
MyConn.Open();

mydtadp.SelectCommand = new MySqlCommand("SELECT * FROM `Appointments`", MyConn);
cmbl = new MySqlCommandBuilder(mydtadp);


mydtadp.Fill(table);

bindingSource1.DataSource = table;
dataGridView1.DataSource = bindingSource1;

但是,当另一个用户进行更改时,这不会更新本地 DataGridView 以反射(reflect)更改。在网上搜索后,我尝试将 VirtualMode 属性设置为 true。仍然没有运气。

接下来,我创建了一个每秒滴答一次的计时器,它会调用

dataGridView1.Refresh();

不过,当另一个用户更新数据库时,更改不会反射(reflect)在本地 DGV 上。我找到了另一篇建议尝试的文章

bindingSource1.ResetBinding(false); 

我把它放在我的计时器上的滴答功能上,仍然没有更新。

我在 MDSN 上找到了一篇文章这表明我尝试在计时器函数中再次调用 mydtadp.Fill(table); 函数。一样。

我唯一可以开始工作的是保存当前选定行的索引,然后完全重新加载数据集,然后重新选择该索引。然而,这看起来很笨拙,必须有更好的方法来做到这一点。这种方法似乎是不好的做法,并且效果不佳,每当计时器滴答时 DGV 都会闪烁,并且当用户移动光标时,datagridview 需要几秒钟才能 catch 用户。当用户对一行进行更改时,每次击键都需要一个完整的计时器滴答来更新。

最佳答案

我不建议您每次都完全更新 DGV,因为这会带来性能问题。

您可以将 DateTime 列添加到您的 MySQL 表中,当数据库表更新时,您只需将当前 DateTime 放入其中即可。在您的 WinForms 应用程序中,您还添加了一个变量来保存上次查询的日期时间。

然后当计时器计时时,您只需选择那些自 DateTime 变量以来更新的行。

最后,您使用来自 SQL 查询的新数据单独更新 DGV.DataSource(我相信它是 System.Data.DataView)的相应行。

关于C# DGV - 显示实时 MYSQL 数据库表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50654178/

相关文章:

mysql - 通过 Cron 轻松备份多个 MySQL 数据库

c# - 确定 BindingSource 的所有绑定(bind)何时完成

c# - 从 WP8.1 重定向到 WP8 后,ItemsControl 的数据绑定(bind)不起作用

c# - 生成 C# 对象代码并从 xml 文档为其属性赋值

c# - 使用 C# 解析具有多个命名空间的 Xml

mysql - 使用 devise 和 activeadmin 设置新的 Rails 应用程序时,schema.rb 最终为空

mysql - 计算多个平均值中的最大值 - SQL

c# - 空 TextBox 上的 int 验证失败

c# - 在 .ts 中自动创建 .cs 类定义

c# - 计算增减百分比