2013-10-29 41 views
0

更新數據表時遇到問題。我做的是這樣的:OledbDataAdapter不更新表

1)從數據庫中裝載的數據(我們稱之爲「舊數據庫」

2)從其他數據庫(數據加載姑且稱之爲「新數據庫」)

3 )清除了來自新的數據庫

4)合併所有舊數據的所有數據(從舊數據庫中)到新數據庫

下面是我試圖做到這一點:

 string oldDatabase = this.txtOldReport.Text; 
     string newDatabase = this.txtNewReport.Text; 
     string backupFolder = @"C:\Planit\Report Updater\Backups"; 

     if (!Directory.Exists (backupFolder)) { 
      Directory.CreateDirectory (backupFolder); 
     } 

     string fullPath = Path.Combine (backupFolder, string.Format (@"Update Backup_{0}_{1}_{2}_{3}_{4}_{5}", 
                     DateTime.Now.Year, 
                     DateTime.Now.Month, 
                     DateTime.Now.Day, 
                     DateTime.Now.Hour, 
                     DateTime.Now.Minute, 
                     DateTime.Now.Second)); 

     Directory.CreateDirectory (fullPath); 

     File.Copy (oldDatabase, Path.Combine (fullPath, @"Old Report.mdb")); 
     File.Copy (newDatabase, Path.Combine (fullPath, @"New Report.mdb")); 

     OleDbConnection oldConnection = new OleDbConnection (string.Format (@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}", oldDatabase)); 
     OleDbConnection newConnection = new OleDbConnection (string.Format (@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}", newDatabase)); 
     OleDbCommand oldCommand = oldConnection.CreateCommand (); 
     OleDbCommand newSelectCommand = newConnection.CreateCommand (); 

     oldCommand.CommandText = @"SELECT * FROM Reports"; 
     newSelectCommand.CommandText = @"SELECT * FROM Reports"; 

     oldConnection.Open (); 
     newConnection.Open (); 

     DataSet oldDataset = new DataSet (); 
     DataSet newDataset = new DataSet (); 

     OleDbDataAdapter oldAdapter = new OleDbDataAdapter (oldCommand); 
     OleDbDataAdapter newAdapter = new OleDbDataAdapter (newSelectCommand); 

     OleDbCommandBuilder builder = new OleDbCommandBuilder (newAdapter); 

     builder.QuotePrefix = "["; 
     builder.QuoteSuffix = "]"; 

     newAdapter.UpdateCommand = builder.GetUpdateCommand (true); 
     newAdapter.InsertCommand = builder.GetInsertCommand (true); 
     newAdapter.DeleteCommand = builder.GetDeleteCommand (true); 

     oldAdapter.Fill (oldDataset); 
     newAdapter.Fill (newDataset); 

     newDataset.Tables [ 0 ].Rows.Clear (); 

     // removed for a response below 
     //foreach (DataRow dr in newDataset.Tables [ 0 ].Rows) { 
     // dr.Delete (); 
     //} 

     foreach (DataRow dr in oldDataset.Tables [ 0 ].Rows) { 
      dr.SetAdded (); 
      newDataset.Tables [ 0 ].ImportRow (dr); 
     } 

     // removed for the response below 
     //newDataset.AcceptChanges (); 

     newAdapter.Update (newDataset.Tables [ 0 ]); 

     oldConnection.Close (); 
     newConnection.Close (); 

    } 

任何人都可以看到我有的問題嗎?當我打電話給'newAdapter.Update'時,沒有任何反應。

感謝您的任何幫助。

回答

4

MSDN says

當的AcceptChanges被調用時,任何DataRow對象仍處於編輯模式 成功結束其編輯。該的DataRowState也發生變化:所有添加的 和修改的行成爲不變,並刪除的行刪除

所以,這條線

newDataset.AcceptChanges (); 

從導入的表中刪除已添加的RowState,當你調用Update有是沒有行到在數據庫中添加,因爲在newDataset表中的每一行都有它的狀態等於Unchanged

因此,您只需將其刪除,並再次撥打您的newAdapter.Update

作爲一個方面說明,我不認爲你需要循環的newDataset.Tables [0]刪除每一行,因爲你之前

+0

所謂newDataset.Tables[0].Rows.Clear(),我刪除了'newDataSet.AcceptChanges( );'並刪除了循環,但仍然沒有任何反應。當我在更新之前中斷時,我可以看到newDataset.Tables [0]包含其中的所有信息(在添加之前,所有數據都不相同)。但是,它仍然不會實際更新數據庫。 –

+0

您是否檢查newAdapter.InsertCommand是否已設置,並且它是否是有效的命令?我對傳遞給GetInsertCommand的True參數有些懷疑。 – Steve

+0

也可以檢查newDataSet表中的第一行是否具有RowState = Added。 – Steve