如何将一个 DataTable 中的列复制到另一个 DataTable?

69

如何将DataTable中的列仅复制到另一个DataTable中?

6个回答

133

DataTable.Clone()方法可以实现此目的。

DataTable newTable = originalTable.Clone();

第一个DataTable有238列,第二个DataTable有107列,使用“DataTable newTable = originalTable.Clone();”语句将原始表格克隆到新表格,然后将所有列直接复制到第二个表格中。 - Ghotekar Rahul

37
如果只需要列,则可以使用 DataTable.Clone()。 使用 Clone 函数仅复制架构。但是 DataTable.Copy() 复制结构和数据。
例如:
DataTable dt = new DataTable();
dt.Columns.Add("Column Name");
dt.Rows.Add("Column Data");
DataTable dt1 = dt.Clone();
DataTable dt2 = dt.Copy();

dt1 只会有一个列,但是 dt2 将会有一个带有一行的列。


3

Datatable.Clone对于大表格来说速度比较慢。我目前正在使用以下方法:

Dim target As DataTable = 
    New DataView(source, "1=2", Nothing, DataViewRowState.CurrentRows)
    .ToTable()

请注意,此操作仅复制源表的结构,不包含数据。

3
OP 要求 C# 的解决方案,但这是 VB 代码。 - AaA

1
如果您想将特定数据表(dataTable1)的结构(包括列标题,但不包括数据)复制到另一个数据表(dataTable2),可以按照以下代码操作:
        DataTable dataTable2 = dataTable1.Clone();
        dataTable2.Clear();

现在,您可以根据自己的条件填写dataTable2。 :)

1
如果您想将 DataTable 复制到另一个不同的 Schema StructureDataTable 中,则可以执行以下操作:

  • 首先克隆第一个 DataType,以便只获取结构。
  • 然后根据需要修改新创建的结构,然后将数据复制到新创建的 DataTable 中。

因此:

Dim dt1 As New DataTable
dt1 = dtExcelData.Clone()
dt1.Columns(17).DataType = System.Type.GetType("System.Decimal")
dt1.Columns(26).DataType = System.Type.GetType("System.Decimal")
dt1.Columns(30).DataType = System.Type.GetType("System.Decimal")
dt1.Columns(35).DataType = System.Type.GetType("System.Decimal")
dt1.Columns(38).DataType = System.Type.GetType("System.Decimal")
dt1 = dtprevious.Copy()

因此,您将获得相同的DataTable,但结构经过修订。

0

DataTable.Clone() 方法非常适用于创建全新的 DataTable,但有时您可能需要将一个 DataTable 的架构列添加到另一个已存在的 DataTable 中。

例如,如果您从 DataTable 派生了一个新的子类,并希望将架构信息导入其中,那么您不能使用 Clone() 方法。

E.g.:

public class CoolNewTable : DataTable {
   public void FillFromReader(DbDataReader reader) {
       // We want to get the schema information (i.e. columns) from the 
       // DbDataReader and 
       // import it into *this* DataTable, NOT a new one.
       DataTable schema = reader.GetSchemaTable(); 
       //GetSchemaTable() returns a DataTable with the columns we want.

       ImportSchema(this, schema); // <--- how do we do this?
   }
}

答案就是使用模式表的列作为模板,在现有的 DataTable 中创建新的 DataColumns。
即,ImportSchema 的代码应该像这样:
void ImportSchema(DataTable dest, DataTable source) {
    foreach(var c in source.Columns)
        dest.Columns.Add(c);
}

或者,如果你正在使用 Linq:

void ImportSchema(DataTable dest, DataTable source) {
    var cols = source.Columns.Cast<DataColumn>().ToArray();
    dest.Columns.AddRange(cols);
}

这只是一个例子,说明在不使用Clone()创建全新的DataTable的情况下,您可能想要将一个DataTable的模式/列复制到另一个DataTable中。我相信我也遇到过其他几种情况。

2
如果我尝试像你上面在“ImportSchema”中建议的迭代循环一样操作 - 我会收到一个错误,指出该列已经属于另一个DataTable。换句话说,您不能循环现有的DataTable列集合并将这些特定实例分配给不同的DataTable实例。 - bkwdesign
我认为这可能是编写ImportSchema的方法: Dim ms As New IO.MemoryStream srcDataTable.WriteXmlSchema(ms) ms.Seek(0, IO.SeekOrigin.Begin) destDataTable.ReadXmlSchema(ms) - bkwdesign
1
最后两个示例将失败,并显示错误消息:System.ArgumentException:“列'Name'已经属于另一个DataTable。” - BillW
这个回答需要被删除。 - undefined

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