使用MySQL数据库同步DataTable有两种方式

时间:2014-10-03 14:30:52

标签: c# mysql datatable dataset database-concurrency

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

简而言之:

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

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

以这种方式从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秒取一次Table并对它进行比较。然后我将更改写入我的dsTable。这有效,但下次我调用UpdateTable()时会收到错误:

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

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

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

我现在被困住了。有一个好方法吗?

1 个答案:

答案 0 :(得分:0)

好的,现在我明白了。

首先:当一行的RowState设置为modified(设置新值时),我调用mysqlDataAdapter.Update(dsTable,_ tablename);我收到错误,因为设置值与数据库中的设置值相同。

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

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