【问题标题】:how to copy only the columns in a DataTable to another DataTable?如何仅将 DataTable 中的列复制到另一个 DataTable?
【发布时间】:2010-06-01 12:52:23
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    DataTable.Clone() 应该可以解决问题。

    DataTable newTable = originalTable.Clone();
    

    【讨论】:

    • 第一个数据表有 238 列,第二个数据表有 107 列使用 DataTable newTable = originalTable.Clone();然后将所有列复制到直接第二个表
    【解决方案2】:

    如果只需要列,则可以使用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()
      

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

      【讨论】:

      • OP 要求 C# 解决方案。这是VB
      【解决方案4】:

      如果要将带有列标题(无数据)的特定数据表(dataTable1)的结构转换为另一个数据表(dataTable2),您可以按照以下代码:

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

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

      【讨论】:

        【解决方案5】:

        如果您想将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,但结构经过修改

        【讨论】:

          【解决方案6】:

          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 的情况的一个示例。我相信我也遇到过其他几个人。

          【讨论】:

          • 如果我尝试像上面“ImportSchema”中所示的建议迭代那样执行循环 - 我收到一条错误消息,指出该列已经属于另一个 DataTable。换句话说,您不能循环现有 DataTable 的列集合并将这些特定实例分配给不同的 DataTable 实例。
          • 我认为这可能是写出 ImportSchema Dim ms As New IO.MemoryStream srcDataTable.WriteXmlSchema(ms) ms.Seek(0, IO.SeekOrigin.Begin) destDataTable.ReadXmlSchema(ms) 的方式
          • 最后两个示例将失败并显示错误消息:System.ArgumentException: 'Column 'Name' already属于另一个 DataTable。'
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-26
          • 2011-02-05
          • 2011-07-06
          • 2011-06-21
          • 1970-01-01
          相关资源
          最近更新 更多