为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕神8447489 2021-07-08 14:11:36
我有一个场景,我有多个用户(一次大约 50 个)连接到一个表,所有用户都不断对已经存在的行进行更改。我需要做的是以某种方式始终显示数据库的实时视图。拥有表的缓存副本不是一个有效的选择,因为所有用户都需要立即查看所有更改。当我第一次加载我正在使用的数据库时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 以反映更改。在网上搜索后,我尝试将该VirtualMode属性设置为 true。仍然没有运气。接下来,我创建了一个计时器,它会每秒滴答一次,它会调用dataGridView1.Refresh();尽管如此,当另一个用户更新数据库时,更改不会反映在本地 DGV 上。我找到了另一篇建议尝试的文章bindingSource1.ResetBinding(false); 我把它放在我的计时器上的滴答功能,仍然没有更新。我在MDSN上找到了一篇文章,建议我尝试mydtadp.Fill(table);在计时器函数中再次调用该函数。一样。我唯一可以开始工作的是保存当前选定行的索引,然后完全重新加载数据集,然后重新选择该索引。但是,这看起来很笨拙,必须有更好的方法来做到这一点。这种方法似乎是不好的做法,并且它的效果不佳,每当计时器滴答作响时,DGV 都会闪烁,并且当用户移动光标时,datagridview 需要几秒钟才能赶上用户。当用户对一行进行更改时,每次击键都需要一个完整的计时器滴答来更新。
查看完整描述

1 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

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

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

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

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


查看完整回答
反对 回复 2021-07-18
  • 1 回答
  • 0 关注
  • 246 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信