2013-03-06 110 views
5

我想使用MySqlDatAdapter更新MySql表。但是,桌子永遠不會更新!我之前做過,但使用SQL服務器。還有什麼是特定於MySql,我在我的代碼中缺少的?使用MySqlDataAdapter更新不起作用

 DataTable myTable = new DataTable("testtable"); 

     MySqlConnection mySqlCon = new MySqlConnection(ConfigurationManager.ConnectionStrings["DBConStr"].ConnectionString); 

     MySqlCommand mySqlCmd = new MySqlCommand("SELECT * FROM testtable WHERE Name = 'Tom'"); 
     mySqlCmd.Connection = mySqlCon; 

     MySqlDataAdapter adapter = new MySqlDataAdapter(mySqlCmd); 
     MySqlCommandBuilder myCB = new MySqlCommandBuilder(adapter); 
     adapter.UpdateCommand = myCB.GetUpdateCommand(); 

     mySqlCon.Open(); 

     adapter.Fill(myTable); 
     myTable.Rows[0]["Name"] = "Was Tom"; 
     myTable.AcceptChanges(); 
     adapter.Update(myTable); 
     mySqlCon.Close(); 

感謝

回答

7

更新之前刪除myTable.AcceptChanges()。 Othwerwise會將所有行RowState設置爲Unchanged,因此DataAdapter不會知道某些內容已更改。

adapter.Update(myTable)將在更新完成後自行呼叫AcceptChanges本身。

所以......

myTable.Rows[0]["Name"] = "Was Tom"; 
//myTable.AcceptChanges(); 
adapter.Update(myTable); 
+0

@usp:這不是愚蠢的,我認爲很多人誤解AcceptChanges'的'的意思,因爲它的名字所暗示的東西可取befor更新) – 2013-03-06 22:52:03

+0

你是對的,如果我不知道它。但我只是不注意那條線,因爲我複製了其他使用GridView的DataTable的項目中的代碼。無論如何,感謝您的幫助。 – usp 2013-03-06 22:54:17

0

我的某一個需要考慮以下解決方案;在其他情況下,人們可能需要不同的解即使不做任何操作與數據表,當你在調試運行時是這樣,

myTable.GetChanges(); // Return Any of Chnages Made without applying myTable.Accepchanges() 
myTable.GetChanges(DataRowState.Added); // Return added rows without applying myTable.Accepchanges() 
myTable.GetChanges(DataRowState.Deleted); 
myTable.GetChanges(DataRowState.Detached); 
myTable.GetChanges(DataRowState.Modified); 
myTable.GetChanges(DataRowState.Unchanged); 

你可能得到的數據按照上面的命令。因此,在傳遞數據表來更新或插入或刪除命令之前,最好嘗試進行調試。

如果myTable.GetChanges()返回null,那麼您可以將SetAdded()或SetModified()返回到您的DataTable;

foreach(DataRow row in myTable.Rows) 
{ 
    row.SetAdded(); // For Insert Command 
    row.SetModified(); // For Update Command 
}