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

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

DataTable.Clone()应该做的伎俩。

 DataTable newTable = originalTable.Clone(); 

如果只需要列,那么可以使用DataTable.Clone() 。 使用Clonefunction只有模式将被复制。 但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() 

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

DataTable.Clone()方法在您想要创build一个全新的DataTable时效果很好,但是可能会出现这种情况,您需要将一个DataTable中的架构列添加到另一个现有的 DataTable中。

例如,如果您从DataTable派生了一个新的子类,并且想要将模式信息导入到其中,则无法使用Clone()。

例如:

 public class CoolNewTable : DataTable { public void FillFromReader(DbDataReader reader) { // We want to get the schema information (ie 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中创build新的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()创build全新的DataTable的情况的一个示例。 我确定我也遇到了其他几个人。

如果您想将DataTable复制到另一个DataType DataTable ,那么您可以这样做:

  • 首先克隆第一个数据DataType这样你只能得到结构。
  • 然后根据需要更改新创build的结构,然后将数据复制到新创build的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但修改后的结构

如果您想将带有列标题(不包含数据)的特定数据表(dataTable1)的结构放入另一个数据表(dataTable2)中,则可以按照以下代码进行操作:

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

现在你可以根据你的条件填写dataTable2。 🙂