2013-03-06 10 views
5

Sto tentando di utilizzare MySqlDatAdapter per aggiornare una tabella MySql. Ma il tavolo non si aggiorna mai !!! L'ho fatto prima ma con SQL server. C'è qualcos'altro specifico per MySql che mi manca nel mio codice?L'aggiornamento tramite MySqlDataAdapter non funziona

 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(); 

Grazie

risposta

7

Rimuovere myTable.AcceptChanges() prima dell'aggiornamento. Diversamente, imposterà tutte le righe da RowState a Unchanged, quindi DataAdapter non saprà che qualcosa è stato modificato.

adapter.Update(myTable) chiamerà AcceptChanges stesso dopo che l'aggiornamento è terminato.

Quindi ...

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

@usp: Non è stupido, presumo che molte persone fraintendono il significato di 'AcceptChanges' in quanto il suo nome suggerisce qualcosa di desiderabile befor un aggiornamento;) –

+0

hai ragione, se io non lo sapevo. Ma non stavo prestando attenzione a quella riga mentre copiavo il codice da un altro progetto che utilizza un DataTable con GridView. Comunque, grazie per l'aiuto. – usp

0

mio qualcuno bisogno di esaminare la seguente soluzione; In un altro scenario le persone potrebbero aver bisogno di una soluzione diversa. Anche Non fare alcuna manipolazione con Datatable durante il debug a run-time come questo,

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); 

È possibile ottenere i dati in base ai comandi di cui sopra. Quindi meglio provare a eseguire il debug prima di passare il datatable per aggiornare o inserire o eliminare il comando.

Se myTable.GetChanges() restituisce null, è possibile impostare SetAdded() o SetModified() sul DataTable;

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