2011-05-04 109 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