首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataTable与MySQL数据库同步的两种方法

DataTable与MySQL数据库同步的两种方法
EN

Stack Overflow用户
提问于 2014-10-03 14:30:51
回答 1查看 1.2K关注 0票数 0

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

简言之:

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

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

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
private void Row_Changed(object sender, DataRowChangeEventArgs e)
{... ChangeIntegerValueInReflectedTable(...); }

我在这里打电话:

代码语言:javascript
复制
public void ChangeIntegerValueInReflectedTable(int rowIndex, string columnName, int newValue)
{
    dsBom.Tables[0].Rows[rowIndex][columnName] = newValue;
}

若要更新MySQL数据库,请使用:

代码语言:javascript
复制
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)时,我的数据视图会在一个没完没了的循环中被刷新。

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

EN

回答 1

Stack Overflow用户

发布于 2014-10-04 16:45:34

好吧现在我明白了。

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26180915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档