我有一个DataSet/DataTable,我希望将这些更改写入MySQL数据库,如果MySQL数据库中有任何更改,请将这些更改写回DataSet/DataTable。
简言之:
myDataSet -> MySQL数据库(用户编辑值)
myDataSet <- MySQL数据库(另一个用户编辑了MySQL数据库)
从DataSet数据库中填充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.DBConcurrencyException}
我也不知道原因。在从用户界面更新单个值时,我也会更改dsTable中的单元格。
当我调用mysqlDataAdapter.Fill(dsTable,tablename)时,我的数据视图会在一个没完没了的循环中被刷新。
我现在被困住了。有什么好办法吗?
发布于 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服务器上更新。
https://stackoverflow.com/questions/26180915
复制相似问题