ADO.NET – 更新多个DataTable

所以我有一些像这样的代码:

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”在多个表中创建一堆新行,具体取决于一个特定表中某个特定行的内容。

您可以将数据集传递到DataAdapter的Update语句, 语句将更新数据集中的所有表。 更新:不,它没有。 DataAdapter始终只更新一个表。 从MSDN文档中以DataSet作为参数的Update()重载“从名为”Table“的DataTable中为指定DataSet中的每个插入,更新或删除的行调用相应的INSERT,UPDATE或DELETE语句“。 对困惑感到抱歉。 然而,答案的其余部分仍然有效。

如果要确保所有更新都作为primefaces单元成功或失败,请使用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();