如何只将DataTable中的列复制到另一个DataTable?
答案 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
但修改后的结构