【问题标题】:Union DataTables C#联合数据表 C#
【发布时间】:2012-04-05 05:47:16
【问题描述】:

我有一个数据表列表。将它们组合到单个数据表中的最有效方法是什么?这些数据表中的每一个的架构都不同,并且这些表的行数可能会有所不同。

  • Table1 有 A、B 列

  • Table2 有 C、D 列

  • Table3 有 E、F 列

我的输出应该是一个包含以上所有列的结果表,并且应该包含所有行。

几行代码就可以实现吗?可以选择 LINQ 吗?

【问题讨论】:

  • 我可以在...三行代码中做到这一点。

标签: .net ado.net datatable


【解决方案1】:

使用Merge 方法。见http://msdn.microsoft.com/en-us/library/fk68ew7b.aspx


根据您的评论进行更新。如果每个表中只有两列,则无法按预期使用Merge 方法。

要做你想做的事,你需要在每个表上都有一个主键。当一行在表之间有一个共同的标识符时,列将被合并,而不是添加一行。例如,如果 RowId 1 在 Table1 和 Table 2 中,您将得到 RowId 1; A、B、C、D、空、空。如果 RowId 2 仅在 Table1 中,那么您将获得 RowId2; A、B、空、空、空、空。

http://msdn.microsoft.com/en-us/library/system.data.missingschemaaction.aspx

用户可以在每个 DataTable 上显式设置主键约束。 这确保了与现有记录匹配的传入记录 更新而不是附加。

【讨论】:

  • 合并会增加行数。我只想将所有这些包含数据的列添加到单个表中。
  • 那我不明白你想要什么。是的,显然,它会增加行数。如果要为行添加列数据,在这些表上拥有主键很重要。例如,如果我为每个表在 Id 上设置了一个主键,那么具有相同 id 的行将添加列数据而不是添加行。
  • @buffer_overflow 因为它们都是不同的并且列数可能不同,您必须使用不同的命令添加每个表。没有其他办法,因为合并不是你想要的。
  • @buffer_overflow 创建一个具有您想要的结构的新表。然后,您可以使用INSERT INTO newTable SELECT ... FROM FirstTable UNION ALL SELECT ... FROM SecondTable 等等。
  • @buffer_overflow;您可以为每个表添加一个自动编号列。调用列“RowIndex”。将其设置为主键。 (您可能必须使用实际的行索引填充该值。)进行合并,删除该列。它会给你你想要的。
【解决方案2】:

以上问题的解答:

                DataColumn[] keys = new DataColumn[1];

                DT.Columns.Add(primaryColumn, typeof(System.Int32));
                for (int i = 0; i < DT.Rows.Count; i++)
                {
                    DT.Rows[i][primaryColumn] = i;
                }
                keys[0] = DT.Columns[primaryColumn];
                mapDT.PrimaryKey = keys;

                tables.Add(DT); 

    private static DataTable MergeDataTables(List<DataTable> tables, string keyColumn)
    {
        DataTable mergedTable = new DataTable();

        foreach (DataTable dt in tables)
            mergedTable.Merge(dt);

        mergedTable.PrimaryKey = null;

        mergedTable.Columns.Remove(keyColumn);

        return mergedTable;
    }

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2019-04-21
    • 2013-04-11
    相关资源
    最近更新 更多