2011-05-04 71 views
1

所以我有一些像這樣的代碼:ADO.NET - 更新多個數據表

 DataSet dataSet = new DataSet();    
     DataTable dataTable1 = new DataTable("Table1"); 
     DataTable dataTable2 = new DataTable("Table2"); 
     DataTable dataTable3 = new DataTable("Table3"); 
     DataTable dataTable4 = new DataTable("Table4"); 
     dataSet.Tables.Add(dataTable1); 
     dataSet.Tables.Add(dataTable2); 
     dataSet.Tables.Add(dataTable3); 
     dataSet.Tables.Add(dataTable4); 

     SqlDataAdapter dataAdapter1 = new SqlDataAdapter("SELECT * FROM Table1 WHERE ID = 1", sqlConnection); 
     SqlDataAdapter dataAdapter2 = new SqlDataAdapter("SELECT Column1, Column2, Column3 FROM Table2", sqlConnection); 
     SqlDataAdapter dataAdapter3 = new SqlDataAdapter("SELECT Column1, Column2, Column3 FROM Table3", sqlConnection); 
     SqlDataAdapter dataAdapter4 = new SqlDataAdapter("SELECT Column1, Column2, Column3 FROM Table4", sqlConnection); 

     SqlCommandBuilder commandBuilder1 = new SqlCommandBuilder(dataAdapter1); 
     SqlCommandBuilder commandBuilder2 = new SqlCommandBuilder(dataAdapter2); 
     SqlCommandBuilder commandBuilder3 = new SqlCommandBuilder(dataAdapter3); 
     SqlCommandBuilder commandBuilder4 = new SqlCommandBuilder(dataAdapter4);    

     dataAdapter1.Fill(dataTable1); 
     dataAdapter2.FillSchema(dataTable2, SchemaType.Source); 
     dataAdapter3.FillSchema(dataTable3, SchemaType.Source); 
     dataAdapter4.FillSchema(dataTable4, SchemaType.Source); 

     //do a bunch of code that updates the one row from Table1 
     //and adds lots of new rows to Table2, Table3, Table4 

     dataAdapter1.Update(dataTable1); 
     dataAdapter2.Update(dataTable2); 
     dataAdapter3.Update(dataTable3); 
     dataAdapter4.Update(dataTable4); 
     dataSet.AcceptChanges(); 

反正是有使這個簡單了很多?如果計算機在「dataAdapter2.Update(dataTable2);」之後崩潰,會發生什麼情況?我希望能夠以某種方式使用一個更新呼叫來更新所有內容。那可能嗎?

此外,這是甚至是最好的方式來做到這一點?使用「this」在多個表中創建一堆新行,具體取決於某個特定表中某個特定行的內容。

回答

5

您可以將數據集傳遞到DataAdapter的更新語句 中,該語句將更新數據集中的所有表。 更新:不,它不。 DataAdapter始終只更新一個表。以MSDN documentation爲起點,將DataSet作爲其參數的Update()重載「從名爲」Table「的DataTable中爲指定DataSet中的每個插入,更新或刪除行調用相應的INSERT,UPDATE或DELETE語句。 「對困惑感到抱歉。但答案的其餘部分仍然有效。

如果你想確保所有的更新成功或失敗作爲一個原子單元,使用SqlTransaction對象:

DataSet ds = new DataSet(); 
// do something with the dataset 

SqlDataAdapter dataAdapter = new SqlDataAdapter(); 
SqlConnection cn = new SqlConnection(connString); 
cn.Open(); 

SqlTransaction trans = cn.BeginTransaction(); 

SqlDataAdapter dataAdapter = new SqlDataAdapter(); 

// set the InsertCommand, UpdateCommand, and DeleteCommand for the data adapter 

dataAdapter.InsertCommand.Transaction = trans; 
dataAdapter.UpdateCommand.Transaction = trans; 
dataAdapter.DeleteCommand.Transaction = trans; 

try 
{ 
    dataAdapter.Update(ds); 
    trans.Commit(); 
} 
catch 
{ 
    trans.Rollback(); 
} 

cn.Close(); 
+0

如何將一個DataAdapter的知道如何更新存儲在DataSet中的多個表?我使用了多個DataAdapter,因爲它們都從數據庫的不同表中選擇,然後在每個DataAdapter上使用CommandBuilder自動構建Update/Insert命令。 – gamzu07 2011-05-05 13:30:23

+0

爲了迴應你的問題,我開始指出'SqlDataAdapter的[MSDN文檔](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.update.aspx) .Update()'有一個接受DataSet的重載。確實如此。但後來我看到了你的觀點,並且進一步挖掘了一點。你是正確的,DataAdapters只更新一個表。採用DataSet的重載在DataSet中查找名爲「Table」的表。我的錯。我會相應地更新我的答案。 – 2011-05-05 13:43:38

+0

我也發現需要按以下順序完成: dA = new SqlDataAdapter(「SELECT * FROM Table」,cn); dA.SelectCommand.Transaction = tran; commandBuilder = new SqlCommandBuilder(dA); dA.InsertCommand = commandBuilder.GetInsertCommand(); dA.UpdateCommand = commandBuilder.GetUpdateCommand(); dA.DeleteCommand = commandBuilder.GetDeleteCommand(); dA.InsertCommand.Transaction = tran; dA.UpdateCommand.Transaction = tran; dA.DeleteCommand.Transaction = tran; – gamzu07 2011-05-05 15:27:55