【问题标题】:ADO.NET - Updating Multiple DataTablesADO.NET - 更新多个数据表
【发布时间】:2011-05-04 19:52:30
【问题描述】:

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

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

【问题讨论】:

    标签: c# ado.net datatable


    【解决方案1】:

    您可以将数据集传递到 DataAdapter 的更新语句中,这将更新数据集中的所有表。 更新:不,它不会。 DataAdapter 总是只更新一张表。从 MSDN documentation 到将 DataSet 作为其参数的 Update() 的重载,“从名为“Table “。”对困惑感到抱歉。不过,其余答案仍然有效。

    如果您想确保所有更新作为一个原子单元成功或失败,请使用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();
    

    【讨论】:

    • DataAdapter 如何知道如何更新存储在 DataSet 中的多个表?我使用了多个 DataAdapter,因为它们每个都从数据库中的不同表中选择,然后使用每个 DataAdapter 上的 CommandBuilder 自动构建更新/插入命令。
    • 在回答您的问题时,我开始指出SqlDataAdapter.Update()MSDN documentation 具有接受DataSet 的重载。确实如此。但后来我看到了你的观点,并进一步挖掘。你是对的,DataAdapters 只更新一个表。采用 DataSet 的重载在 DataSet 中查找名为“Table”的表。我的错。我会相应地更新我的答案。
    • 我也发现事情需要按这个顺序做: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;
    • 从测试中也可以看出,我不需要在事务中设置所有的插入、更新和删除命令,只需要设置选择命令来使用事务。
    • 如果选择查询足够简单,SqlCommandBuilder 可以找出正确的插入和更新命令。但是,它并不总是有效,因此我建议将它们设置为小心。但如果它工作正常,那么一定要继续使用它。
    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2011-12-15
    相关资源
    最近更新 更多