【问题标题】:Synchronize DataTable with MySQL database two waysDataTable与MySQL数据库同步两种方式
【发布时间】:2014-11-28 15:04:34
【问题描述】:

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

简而言之:

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

myDataSet

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

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.DBConcurrencyException}

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

当我调用 mysqlDataAdapter.Fill(dsTable, tablename) 时,我的 datagridview 会无限循环刷新。

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

【问题讨论】:

    标签: c# mysql datatable dataset database-concurrency


    【解决方案1】:

    好的,现在我明白了。

    首先:当一行的 RowState 设置为 modified(设置新值时就是这种情况)并且我调用 mysqlDataAdapter.Update(dsTable, _tablename);我收到错误是因为设置的值与数据库中的相同。

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

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

    【讨论】: