0

ADO.NET - 更新多个数据表

我发现上面的问题正是我正在寻找并尝试实施解决方案的问题......

我正在尝试找到将多个表更新到 sqlserver 2008 并确保多个表上的事务的最佳解决方案。如果插入一个表失败,则回滚其他表上的先前更新。

  1. sqldataadapter 一次只更新一张表
  2. 我知道我们可以一次在一个数据适配器上进行事务,但需要更新多个表

以下是根据上面提供的答案修改的代码,但数据适配器出错。我想我需要设置插入、更新和删除命令,但不确定如果有多个表是如何工作的???有人可以填写缺少的链接吗?

        using (SqlConnection con = new SqlConnection(SqlServerConnectionString))
        {
            con.Open();
            //table is an array of datatable and contains data to be inserted
            for (int i = 0; i < table.Length; i++)
            {
                ds.Tables.Add(table[i]);
            }

            SqlTransaction trans = con.BeginTransaction();

            SqlDataAdapter dataAdapter = new SqlDataAdapter();
            //Need to set insert,select, update, delete???? on multiple tables?

            //dataAdapter.Fill(ds);
            dataAdapter.InsertCommand.Transaction = trans; //null object error here
            dataAdapter.UpdateCommand.Transaction = trans;
            dataAdapter.DeleteCommand.Transaction = trans;

            try
            {

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

            }
4

2 回答 2

1

感谢大家的意见。我认为@Charlie 之前用这个 q/a 回答的问题让我大吃一惊:ADO.NET - Updating Multiple DataTables

我想也许你可以使用数据集进行更新,但我想你仍然需要创建额外的数据适配器,然后调用 update. 因此,上一个问题的答案是执行@gamzu07 想要做的唯一其他简化方法是使用数组而不是每次都声明它。下面的代码有效,但对我来说似乎很迟钝,除了构建插入命令并执行它之外,还有没有人有更好的主意......?

            SqlDataAdapter[] dataAdapter = new SqlDataAdapter[table.Length];

            for (int i = 0; i < table.Length; i++)
            {

                dataAdapter[i] = new SqlDataAdapter("select * from " + table[i].TableName, con);
                SqlCommandBuilder cb = new SqlCommandBuilder(dataAdapter[i]);
                dataAdapter[i].InsertCommand = cb.GetInsertCommand();
                dataAdapter[i].Fill(table[i]);

            }

            SqlTransaction trans = con.BeginTransaction();

            try
            {
                for(int i=0;i < table.Length;i++){
                    dataAdapter[i].InsertCommand.Transaction = trans;
                    dataAdapter[i].Update(table[i]);
                }
                trans.Commit();
            }
            catch(Exception ex)
            {
                trans.Rollback();
            }
于 2011-11-10T15:01:56.583 回答
0

您确实需要为每个命令定义命令 - 我建议使用SqlCommandBuilder来完成这项工作。

但是请注意,SqlDataAdapter 仅适用于一个DataTable。如果这是第一个表,则从文档中不清楚:

Update 方法在执行更新之前从第一个映射中列出的表中检索行。

http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx

...或者可能只是 DataSet 中唯一一个名为 Table 的表:

更新 | 从名为“Table”的 DataTable 中为指定 DataSet 中的每个插入、更新或删除的行调用相应的 INSERT、UPDATE 或 DELETE 语句。

http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx

在任何情况下,如果您使用的是 SqlDataAdapter,您对表的循环将需要调用 Update。

编辑

无论如何,据我所知,这里的 SqlDataAdapter 都不是一个好的选择。如果您只想在 DataTables 之间共享事务,只需使用一系列共享 SqlTransaction 的 SqlCommand。

(如果这还不够清楚,我会在我开始工作时添加一个代码示例)

于 2011-11-09T22:55:42.823 回答