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

时间:2010-06-01 12:52:24

标签: c# asp.net

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

6 个答案:

答案 0 :(得分:96)

DataTable.Clone()应该做到这一点。

DataTable newTable = originalTable.Clone();

答案 1 :(得分:25)

如果只需要列,则可以使用DataTable.Clone()。使用Clone函数时,只会复制架构。但是DataTable.Copy()复制了结构和数据

E.g。

DataTable dt = new DataTable();
dt.Columns.Add("Column Name");
dt.Rows.Add("Column Data");
DataTable dt1 = dt.Clone();
DataTable dt2 = dt.Copy();

dt1只有一列,但dt2会有一列有一行。

答案 2 :(得分:3)

Datatable.Clone对于大型表来说很慢。我目前正在使用它:

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

请注意,这只会复制源表的结构,而不是数据。

答案 3 :(得分:1)

当您想要创建一个全新的DataTable时,DataTable.Clone()方法很有用,但是在某些情况下您可能希望将架构列从一个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);
}

这只是您可能希望将架构/列从一个DataTable复制到另一个DataTable而不使用Clone()创建全新DataTable的情况的一个示例。我相信我也遇到过其他几个人。

答案 4 :(得分:1)

如果您希望具有列标题(没有数据)的特定数据表(dataTable1)的结构到另一个数据表(dataTable2)中,您可以按照以下代码:

        DataTable dataTable2 = dataTable1.Clone();
        dataTable2.Clear();

现在您可以根据自己的情况填写dataTable2。 :)

答案 5 :(得分:0)

如果您要将DataTable复制到另外DataTable的其他Schema Structure,那么您可以这样做:

  • 首先克隆第一个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但修改后的结构