【问题标题】:Copy rows from one Datatable to another DataTable?将行从一个数据表复制到另一个数据表?
【发布时间】:2023-03-16 03:55:01
【问题描述】:

如何在 c# 中将特定行从 DataTable 复制到另一个 Datable?会有不止一排。

【问题讨论】:

    标签: c# datatable


    【解决方案1】:
    foreach (DataRow dr in dataTable1.Rows) {
        if (/* some condition */)
            dataTable2.Rows.Add(dr.ItemArray);
    }
    

    以上示例假设dataTable1dataTable2 具有相同的列数、类型和顺序。

    【讨论】:

    • 这不会导致“该行已经属于另一个表。”
    • @McArthey 不,它不会;正在从现有行中的值创建一个新行。该行本身没有被添加到另一个 DataTable。
    • @DawoodAbbasi 只有在表达式末尾省略 ItemArray 部分时才会发生这种情况。确保您添加的是行的值,而不是行本身。
    • @DawoodAbbasi 请参阅 MSDN 文档以了解 DataTable.Clone 方法:msdn.microsoft.com/en-us/library/…
    • 虽然您的回答在技术上是正确的,但您的代码示例并没有解决您的假设。 @RageeshGr 的答案处理了所有假设,恕我直言,写得更简洁,更不容易出错。
    【解决方案2】:

    试试这个

        String matchString="ID0001"//assuming we have to find rows having key=ID0001
        DataTable dtTarget = new DataTable();
        dtTarget = dtSource.Clone();
        DataRow[] rowsToCopy;
        rowsToCopy = dtSource.Select("key='" + matchString + "'");
        foreach (DataRow temp in rowsToCopy)
        {
            dtTarget.ImportRow(temp);
        }
    

    【讨论】:

    • @ManojSavalia,有什么不性价比的替代方案?
    【解决方案3】:

    将指定的行从表复制到另一个

    // here dttablenew is a new Table  and dttableOld is table Which having the data 
    
    dttableNew  = dttableOld.Clone();  
    
    foreach (DataRow drtableOld in dttableOld.Rows)
    {
       if (/*put some Condition */)
       {
          dtTableNew.ImportRow(drtableOld);
       }
    }
    

    【讨论】:

    • 如果导入后不再需要使用dttableOld,是否还需要使用Clone()?
    • 伟大而实用!谢谢!
    • @Sam 关于你的问题,克隆是复制表结构,如果你的表已经是相同的数据类型,那么你不需要它。
    • 有更好的方法来做到这一点。 entityColumnMetadata = changedColumnMetadata.AsEnumerable().Where(dataRow => entityName.Equals(dataRow["EntityName"])).CopyToDataTable();
    【解决方案4】:

    看看这个,你可能会喜欢(之前请克隆 table1 到 table2):

    table1.AsEnumerable().Take(recodCount).CopyToDataTable(table2,LoadOption.OverwriteChanges);
    

    或者:

    table1.AsEnumerable().Where ( yourcondition  ) .CopyToDataTable(table2,LoadOption.OverwriteChanges);
    

    【讨论】:

    • 这是一种更好的方法,因为它使用内置功能从一个 DataTable 到另一个 DataTable 进行范围复制甚至选择行,而无需显式迭代每个数据表,这与所有 foreach 循环 .ForEach 方法不同基于答案。
    【解决方案5】:

    下面的示例是复制一行的最快方法。 正在根据列名复制每个单元格。 如果您不需要复制特定的单元格,请尝试捕获或添加 if。 如果您要复制多于 1 行,则循环下面的代码。

    DataRow dr = dataset1.Tables[0].NewRow();
    for (int i = 0; i < dataset1.Tables[1].Columns.Count; i++)
    {
        dr[dataset1.Tables[1].Columns[i].ColumnName] = dataset1.Tables[1].Rows[0][i];
    }
    
    datasetReport.Tables[0].Rows.Add(dr);
    

    dataset1.Tables[1].Rows[0][i];将索引 0 更改为您指定的行索引,或者如果您要循环或者如果它是合乎逻辑的,您可以使用变量

    【讨论】:

      【解决方案6】:

      支持:4、3.5 SP1,您现在可以只调用对象上的方法。

      DataTable dataTable2 = dataTable1.Copy()
      

      【讨论】:

      • 从技术上讲,这会创建一个数据表的副本。虽然问题中没有明确说明,但 dataTable2 可能已经存在并且其中包含我们不想丢失的其他行。此外,该问题特别指出“特定行”,而这只处理所有行。
      【解决方案7】:

      由于其他帖子的结果,这是我能得到的最短的:

      DataTable destTable = sourceTable.Clone();
      sourceTable.AsEnumerable().Where(row => /* condition */ ).ToList().ForEach(row => destTable.ImportRow(row));
      

      【讨论】:

      • 这基本上是一个foreach。此外,您没有按照 OP 的要求过滤条件。
      • 现在,如果我清除了sourceTabledestTable 也会清除吗?
      • 我希望能够赋值并清除原始变量而不清除目标。
      【解决方案8】:
       private void CopyDataTable(DataTable table){
           // Create an object variable for the copy.
           DataTable copyDataTable;
           copyDataTable = table.Copy();
           // Insert code to work with the copy.
       }
      

      【讨论】:

      • 你的代码对我来说很完美,是一个非常简单的代码,谢谢
      【解决方案9】:

      要复制整个数据表,只需这样做:

      DataGridView sourceGrid = this.dataGridView1;
      DataGridView targetGrid = this.dataGridView2;
      targetGrid.DataSource = sourceGrid.DataSource;
      

      【讨论】:

      • 问题在于如何从数据表中复制特定行,而不是全部。
      【解决方案10】:

      对于那些想要单命令 SQL 查询的人:

      INSERT INTO TABLE002 
      (COL001_MEM_ID, COL002_MEM_NAME, COL002_MEM_ADD, COL002_CREATE_USER_C, COL002_CREATE_S)
      SELECT COL001_MEM_ID, COL001_MEM_NAME, COL001_MEM_ADD, COL001_CREATE_USER_C, COL001_CREATE_S
      FROM TABLE001;
      

      此查询会将数据从TABLE001 复制到TABLE002,并且我们假设两列具有不同的列名。

      列名是一对一映射的,例如:

      COL001_MEM_ID -> COL001_MEM_ID

      COL001_MEM_NAME -> COL002_MEM_NAME

      COL001_MEM_ADD -> COL002_MEM_ADD

      COL001_CREATE_USER_C -> COL002_CREATE_USER_C

      COL002_CREATE_S -> COL002_CREATE_S

      如果你需要一些条件,你也可以指定 where 子句。

      【讨论】:

        【解决方案11】:

        我已经创建了一个简单的方法来解决这个问题

         DataTable newTable = oldtable.Clone();    
         for (int i = 0; i < oldtable.Rows.Count; i++)
         {
           DataRow drNew = newTable.NewRow();    
           drNew.ItemArray = oldtable.Rows[i].ItemArray;    
           newTable.Rows.Add(drNew);   
         } 
        

        【讨论】:

        • 一个更简单的方法是使用for,而不是使用foreach (Datarow dr...)
        【解决方案12】:

        有更好的方法来做到这一点。

        数据表 targetDataTable = new DataTable(); targetDataTable = changedColumnMetadata.AsEnumerable().Where(dataRow => entityName.Equals(dataRow["EntityName"])).CopyToDataTable();

        请试试这个,如果有任何问题,请告诉我。

        【讨论】:

          【解决方案13】:

          你可以调用DataTable.Copy()方法,例如:

             DataSet ds = new DataSet();
             System.Data.DataTable dt = new System.Data.DataTable();
             dt = _BOSearchView.DS.Tables[BusLib.TPV.TableName.SearchView].Copy();
             ds.Tables.Add(dt);
             UltGrdSaleExcel.SetDataBinding(ds, dt.TableName, true);
          

          【讨论】:

            【解决方案14】:

            我需要将具有相同结构的多个表中的行复制到一个新表中,以用作 datagridview 的数据源:

            // Generate DataTable[] alltables from multiple datatables
            
            DataTable newTable = alltables[0].Clone();
            foreach (DataTable dt in alltables)
            {
               for (int i = 0; i < dt.Rows.Count; i++)
                  newTable.Rows.Add(dt.Rows[i].ItemArray);
            }
            

            【讨论】:

              猜你喜欢
              • 2012-11-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-16
              • 1970-01-01
              • 2018-10-31
              • 2011-05-10
              相关资源
              最近更新 更多