【问题标题】:How to append one DataTable to another DataTable如何将一个数据表附加到另一个数据表
【发布时间】:2010-10-25 21:30:53
【问题描述】:

我想将一个数据表附加到另一个数据表。我看到 DataTable 类有两种方法; “加载(IDataReader)”和“合并(DataTable)”。从文档中,如果存在行,两者似乎都将传入数据与现有 DataTable '合并'。我将在数据访问层中进行合并。

我可以使用IDataReader 并使用Load 方法来合并DataTables。或者我可以使用IDataReader 加载一个DataSet,从DataSet 中获取DataTable,然后使用Merge 方法合并DataTable。

我想知道是否有人可以告诉我使用哪种方法合适?

或者,如果您对如何完成此任务有不同的建议,请告诉我。

【问题讨论】:

    标签: c# .net vb.net datatable


    【解决方案1】:

    同一列名称中的数据类型必须是相等的。

    dataTable1.Merge(dataTable2);
    

    之后的结果是:

    数据表1 = 数据表1 + 数据表2

    【讨论】:

      【解决方案2】:

      Merge 需要一个 DataTable,Load 需要一个 IDataReader - 因此,根据您的数据层允许您访问的内容,使用所需的方法。我的理解是 Load 会在内部调用 Merge,但不能 100% 确定。

      如果您有两个数据表,请使用合并。

      【讨论】:

        【解决方案3】:

        您可以让您的DataAdapter 完成这项工作。 DataAdapter.Fill(DataTable) 会将您的新行附加到 DataTable 中的任何现有行。

        【讨论】:

        • 让艰巨的任务看起来轻松!
        【解决方案4】:

        添加两个包含数据表的数据集,现在它将根据需要合并

        DataSet ds1 = new DataSet();
        DataSet ds2 = new DataSet();
        
        DataTable dt1 = new DataTable();
        dt1.Columns.Add(new DataColumn("Column1", typeof(System.String)));
        
        DataRow newSelRow1 = dt1.NewRow();
        newSelRow1["Column1"] = "Select";
        dt1.Rows.Add(newSelRow1);
        
        DataTable dt2 = new DataTable();
        dt2.Columns.Add(new DataColumn("Column1", typeof(System.String)));
        
        DataRow newSelRow2 = dt1.NewRow();
        newSelRow2["Column1"] = "DataRow1Data";  // Data
        dt2.Rows.Add(newSelRow2);
        
        ds1.Tables.Add(dt1);
        ds2.Tables.Add(dt2);
        
        ds1.Tables[0].Merge(ds2.Tables[0]);
        

        现在 ds1 将拥有合并的数据

        【讨论】:

        • 如果有简单且内置的方法可以完成完全相同的工作,则无需费力。作为程序员已经赶上了巨大的压力:)
        【解决方案5】:

        考虑一个可以巧妙地处理任意多表的解决方案。

        //ASSUMPTION: All tables must have the same columns
        var tables = new List<DataTable>();
        tables.Add(oneTableToRuleThemAll);
        tables.Add(oneTableToFindThem);
        tables.Add(oneTableToBringThemAll);
        tables.Add(andInTheDarknessBindThem);
        //Or in the real world, you might be getting a collection of tables from some abstracted data source.
        
        //behold, a table too great and terrible to imagine
        var theOneTable = tables.SelectMany(dt => dt.AsEnumerable()).CopyToDataTable();
        

        封装成一个助手以供将来重用:

        public static DataTable CombineDataTables(params DataTable[] args)
        {
            return args.SelectMany(dt => dt.AsEnumerable()).CopyToDataTable();
        }
        

        只在代码中声明了几个表?

        var combined = CombineDataTables(dt1,dt2,dt3);
        

        想要合并到现有表之一而不是创建一个新表?

        dt1 = CombineDataTables(dt1,dt2,dt3);
        

        已经有表的集合,而不是一一声明?

        //Pretend variable tables already exists
        var tables = new[] { dt1, dt2, dt3 };
        var combined = CombineDataTables(tables);
        

        【讨论】:

          【解决方案6】:

          使用循环

            for (int i = 0; i < dt1.Rows.Count; i++)
                  {      
                     dt2.Rows.Add(dt1.Rows[i][0], dt1.Rows[i][1], ...);//you have to insert all Columns...
                  }
          

          【讨论】:

          • 我不确定这是否能满足主要问题的要求。请检查一下。
          猜你喜欢
          • 1970-01-01
          • 2019-02-02
          • 1970-01-01
          • 2014-10-11
          • 2010-11-22
          • 2019-05-24
          • 1970-01-01
          • 1970-01-01
          • 2017-11-16
          相关资源
          最近更新 更多