如何将一个DataTable追加到另一个DataTable

56
我想将一个 DataTable 追加到另一个 DataTable。DataTable 类有两个方法:“Load(IDataReader)”和“Merge(DataTable)”。根据文档,这两种方法都会在行存在时将传入的数据与现有 DataTable 合并。我将在数据访问层中执行合并操作。
我可以使用 IDataReader 并使用 Load 方法来合并 DataTable。或者我可以使用 IDataReader 加载一个 DataSet,从 DataSet 获取 DataTable,然后使用 Merge 方法来合并 DataTable。
我想知道哪种方法是正确的方法?
或者,如果您有其他建议来完成此任务,请告诉我。
6个回答

83

相同列名的数据类型必须相等。

dataTable1.Merge(dataTable2);

之后的结果是:

dataTable1 = dataTable1 + dataTable2


52

Merge方法需要传入一个DataTable类型的参数,而Load方法则需要传入IDataReader类型的参数。因此,根据你的数据层提供的访问方式,选择使用相应的方法。我理解Load方法会在内部调用Merge方法,但不确定是否完全正确。

如果你有两个DataTable,使用Merge方法。


20

你可以让你的 DataAdapter 去做这件事。 DataAdapter.Fill(DataTable) 会将新行附加到 DataTable 中的任何现有行。


3
让困难的任务看起来轻松! - ashubuntu

6

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

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 将拥有合并后的数据。

1
没有必要费力气,因为有简单且内置的方法可以完成完全相同的工作。作为一名程序员已经承受了巨大的压力 :) - ashubuntu

4
考虑一种解决方案,可以整洁地处理任意数量的表格。
//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);

1
DataTable.Merge方法无法保持行顺序,因此在需要保持行顺序时最好使用此方法。 - bh_earth0

-1

使用循环

  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...
        }

我不确定这是否满足主要问题的要求。请检查一下。 - Lorenzo Bassetti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接