【发布时间】:2010-06-01 12:52:23
【问题描述】:
如何仅将 DataTable 中的列复制到另一个 DataTable?
【问题讨论】:
如何仅将 DataTable 中的列复制到另一个 DataTable?
【问题讨论】:
DataTable.Clone() 应该可以解决问题。
DataTable newTable = originalTable.Clone();
【讨论】:
如果只需要列,则可以使用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 将有一列一行。
【讨论】:
Datatable.Clone 对于大表来说很慢。我目前正在使用这个:
Dim target As DataTable =
New DataView(source, "1=2", Nothing, DataViewRowState.CurrentRows)
.ToTable()
请注意,这只是复制源表的结构,而不是数据。
【讨论】:
如果要将带有列标题(无数据)的特定数据表(dataTable1)的结构转换为另一个数据表(dataTable2),您可以按照以下代码:
DataTable dataTable2 = dataTable1.Clone();
dataTable2.Clear();
现在您可以根据自己的情况填写 dataTable2 了。 :)
【讨论】:
如果您想将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,但结构经过修改
【讨论】:
DataTable.Clone() 方法在您想要创建一个全新的 DataTable 时非常有效,但在某些情况下,您可能想要将架构列从一个 DataTable 添加到另一个现有 DataTable。
例如,如果您从 DataTable 派生了一个新的子类,并且想要将架构信息导入其中,则不能使用 Clone()。
例如:
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 的情况的一个示例。我相信我也遇到过其他几个人。
【讨论】: