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

时间:2018-06-02 06:31:14

标签: c# mysql data-binding datagridview

我有一个场景,我有多个用户(一次约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就会闪烁,当用户移动光标时,数据网格视图需要花费几秒钟才能赶上用户。当用户对行进行更改时,每次击键都需要一个完整的计时器来更新。

1 个答案:

答案 0 :(得分:2)

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

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

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

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