2014-10-03 71 views
0

我有一個DataSet/DataTable,我想將更改寫入MySQL數據庫,如果MySQL數據庫中有任何更改,請將這些更改寫回到我的DataSet/DataTable。使用MySQL數據庫兩種方式同步DataTable

簡而言之:

myDataSet - > MySQL數據庫(用戶編輯值)

myDataSet < - MySQL數據庫(另一用戶編輯的MySQL數據庫)

填充數據集從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)時,我的datagridview會在無限循環中刷新。

我現在被卡住了。有一個好方法嗎?

回答

0

好吧,現在我明白了。首先:當一行的RowState被設置爲修改(這是設置新值的時候),我調用mysqlDataAdapter.Update(dsTable,_tablename);由於設置值與數據庫中的設置值相同,所以出現此錯誤。第二:因爲我的事件處理程序Row_Changed處於活動狀態,在將表中的值更改爲我在MySQL數據庫中的值之後突然調用mysqlDataAdapter.Update(dsTable,_tablename),然後我可以將RowState設置爲不變。

解決方案: 我簡單地設置一個布爾值,當我搜索和更改遠程MySQL服務器上的差異。雖然此值設置爲true,但Row_Changed不會觸發UpdateTable()。在我的本地表中更改一個值(因爲它在遠程服務器上已更改)時,如果行尚未更改,我將爲該行調用AcceptChanges()。當用戶在這短時間內更改本地表時,我更新的更改不會丟失,它們只是本地的,並且不會立即在遠程MySQL服務器上進行更新。