0

我有一个 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 秒获取一次表格并进行比较。然后我将更改写入我的 dsTable。那行得通,但是下次我调用 UpdateTable() 时,我得到了错误:

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

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

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

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

4

1 回答 1

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 服务器上更新。

于 2014-10-04T16:45:34.223 回答