通过两种方式将DataTable与MySQL数据库同步

本文关键字:MySQL 数据库 同步 DataTable 两种 方式 | 更新日期: 2023-09-27 18:25:25

我有一个DataSet/DataTable,我想将更改写入MySQL数据库,如果MySQL数据库中有任何更改,则将这些更改写回我的DataSet/DataTable。

简而言之:

myDataSet->MySQL数据库(用户编辑值)

myDataSet<-MySQL数据库(另一用户编辑了MySQL数据库)

从MySQL数据库填充数据集是这样完成的:

private MySqlDataAdapter mysqlDataAdapter;
private DataSet dsTable;
private string _tablename;
public void ReadTable(string tablename)
{
    _tablename = tablename;
    String query = "select * from " + tablename;
    if (dsTable == null)
        dsTable = new DataSet();
    mysqlDataAdapter = new MySqlDataAdapter(query, (MySqlConnection)connection);
    MySqlCommandBuilder commandBuilder = new MySqlCommandBuilder(mysqlDataAdapter);
    mysqlDataAdapter.Fill(dsTable, tablename);
}

更新表中的值时,为表设置了Row_Changed EventHandler:

private void Row_Changed(object sender, DataRowChangeEventArgs e)
{... ChangeIntegerValueInReflectedTable(...); }

我打电话的地方:

public void ChangeIntegerValueInReflectedTable(int rowIndex, string columnName, int newValue)
{
    dsBom.Tables[0].Rows[rowIndex][columnName] = newValue;
}

要更新MySQL数据库,我使用:

public void UpdateTable()
{
        mysqlDataAdapter.Update(dsTable, _tablename);
}

这是有效的。现在我想在本地表中更新远程MySQL数据库中的更改。据我所知,mysqlDataAdapter没有这方面的命令。Update不会更新回我的表,只会更新到本地表->MySQL数据库。

因此,我编写了一个函数,每30秒获取一次表并进行比较。然后,我将更改写入dsTable。这是有效的,但下次我调用UpdateTable()时,我会得到错误:

并发冲突:UpdateCommand影响了预期的1条记录中的0条。System.Exception{System.Data.DBConcurrentException}

我不知道为什么。当我从用户界面更新单个值时,我也会更改dsTable中的单元格。

当我调用mysqlDataAdapter.Fill(dsTable,tablename)时,我的datagridview会在一个无休止的循环中刷新。

我现在被卡住了。有好的方法吗?

通过两种方式将DataTable与MySQL数据库同步

好的,现在我明白了。

第一:当一行的RowState设置为modified时(设置新值时就是这样),我调用mysqlDataAdapter.Update(dsTable,_tablename);我得到错误是因为设置的值与数据库中的值相同。

第二:因为我激活了Eventhandler Row_Changed,所以在将表中的值更改为MySQL数据库中的值后,在我将RowState设置为Unchanged之前,突然调用了mysqlDataAdapter.Update(dsTable,_tablename)。

解决方案:我只是在搜索和更改远程MySQL服务器上的差异时设置了一个bool值。当该值设置为true时,Row_Changed不会激发UpdateTable()。当更改本地表中的值时(因为它在远程服务器上已经更改),如果该行尚未更改,我会调用该行的AcceptChanges()。当用户在短时间内对本地表进行更改时,我会更新这些更改。这些更改不会丢失,它们只是本地的,不会立即在远程MySQL服务器上更新。