【问题标题】:Simple way to convert datarow array to datatable将数据行数组转换为数据表的简单方法
【发布时间】:2011-01-08 12:20:14
【问题描述】:

我想将 DataRow 数组转换为 DataTable ... 最简单的方法是什么?

【问题讨论】:

    标签: c# arrays datatable datarow


    【解决方案1】:

    适用于 .Net Framework 3.5+

    DataTable dt = new DataTable();
    DataRow[] dr = dt.Select("Your string");
    DataTable dt1 = dr.CopyToDataTable();
    

    但如果数组中没有行,则会导致源不包含DataRows等错误。因此,如果您决定使用此方法CopyToDataTable(),您应该检查数组以了解它是否有数据行。

    if (dr.Length > 0)
        DataTable dt1 = dr.CopyToDataTable();
    

    MSDN 上提供的参考资料: DataTableExtensions.CopyToDataTable Method (IEnumerable)

    【讨论】:

    • 你从哪里得到copyToDataTable()?我在 .net 2.0 中没有找到它
    • 这应该被标记为正确答案,因为copyToDataTable() 方法会创建所选行的列的完美副本,而datatable.ImportRow(row) 方法不会
    • 如果表中已经有行,则此方法不好,因为它会替换已经存在的行。如果表是空的,开始就可以了。
    • 我更喜欢这种方法,只要 .Net 功能得到优化。不要忘记在您的项目中添加对 System.Data.DataSetExtensions 的引用,这样您就不会沮丧地问自己为什么缺少此方法(像我一样)
    • 记得在 References 中添加 System.Data.DataSetExtensions 程序集
    【解决方案2】:

    为什么不遍历您的 DataRow 数组并添加(如果需要,使用 DataRow.ImportRow 来获取 DataRow 的副本),例如:

    foreach (DataRow row in rowArray) {
       dataTable.ImportRow(row);
    }
    

    确保您的 dataTable 与 DataRow 数组中的 DataRows 具有相同的架构。

    【讨论】:

    • 如果您在尝试将 DataRow 直接绑定到 DataSource 时收到错误消息“MyControl 正在使用无效的数据源。有效的数据源必须实现 IListSource 或 IEnumerable”,则此技术很有帮助控件的属性。操作方法如下:DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
    • +1 我更喜欢这个而不是rowArray.CopyToDataTable();,因为它保留了表模式并且不会用新的表对象替换它!
    • 非常好!但我建议在 foreach 之前克隆 DataTable。它复制 DataTable 的格式:newDataTable = oldDataTable.clone();
    • 提示:您的数据表必须创建列,否则将无法正确填充。
    【解决方案3】:
    DataTable dt = new DataTable(); 
    
    DataRow[] dr = (DataTable)dsData.Tables[0].Select("Some Criteria");
    
    dt.Rows.Add(dr);
    

    【讨论】:

    • 我已经尝试过这样的.. 发生错误类似于“输入数组长于此表中的列数。”
    • 正如 Jay 指出的那样,确保您的 dataTable 与 DataRow 数组中的 DataRows 具有相同的架构
    • 是的.. 我试过了。我用 Datatable1=datatable2.Clone();现在它正在工作......谢谢你:-)
    • 我用一个行数组尝试了这个,但是没有用。对于行数组中的每一行,我创建了一个新行,从原始行复制了 ItemArray 属性,然后添加工作。
    • 这似乎不适用于 .NET Framework 4.0 中发布的示例,也不适用于从 dstata.tables[0] 克隆的“dt”。 @joe 的回答最终确实符合我的目的。无克隆版本错误:“Input array is longer than the number of columns in this table.”。带有克隆版本错误:“Unable to cast object of type 'System.Data.DataRow' to type 'System.IConvertible'.Couldn't store <System.Data.DataRow> in StoreOrder Column. Expected type is Int64.”注意:StoreOrder 是表架构中的第一列。似乎它试图将整个数据行塞入第一列
    【解决方案4】:

    另一种方法是使用 DataView

    // Create a DataTable
    DataTable table = new DataTable()
    ...
    
    // Filter and Sort expressions
    string expression = "[Birth Year] >= 1983"; 
    string sortOrder = "[Birth Year] ASC";
    
    // Create a DataView using the table as its source and the filter and sort expressions
    DataView dv = new DataView(table, expression, sortOrder, DataViewRowState.CurrentRows);
    
    // Convert the DataView to a DataTable
    DataTable new_table = dv.ToTable("NewTableName");
    

    【讨论】:

      【解决方案5】:

      简单的方法是:

      // dtData is DataTable that contain data
      DataTable dt = dtData.Select("Condition=1").CopyToDataTable();
      
      // or existing typed DataTable dt
      dt.Merge(dtData.Select("Condition=1").CopyToDataTable());
      

      【讨论】:

        【解决方案6】:
        DataTable Assetdaterow =
            (
                from s in dtResourceTable.AsEnumerable()
                where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
                select s
            ).CopyToDataTable();
        

        【讨论】:

          【解决方案7】:
          DataTable dt = myDataRowCollection.CopyToDataTable<DataRow>();
          

          【讨论】:

            【解决方案8】:
            DataTable dt = new DataTable();
            foreach (DataRow dr in drResults)
            { 
                dt.ImportRow(dr);
            }   
            

            【讨论】:

              【解决方案9】:

              .Net 3.5+ 添加DataTableExtensions,使用DataTableExtensions.CopyToDataTable 方法

              对于数据行数组,只需使用 .CopyToDataTable() 即可返回数据表。

              对于单个数据行使用

              new DataRow[] { myDataRow }.CopyToDataTable()
              

              【讨论】:

                【解决方案10】:

                您可以像这样使用 System.Linq:

                if (dataRows != null && dataRows.Length > 0)
                {
                   dataTable = dataRows.AsEnumerable().CopyToDataTable();
                }
                

                【讨论】:

                  【解决方案11】:

                  这里是解决方案。它应该可以正常工作。

                  DataTable dt = new DataTable();
                  dt = dsData.Tables[0].Clone();
                  DataRows[] drResults = dsData.Tables[0].Select("ColName = 'criteria');
                  
                  foreach(DataRow dr in drResults)
                  {
                      object[] row = dr.ItemArray;
                      dt.Rows.Add(row);
                  } 
                  

                  【讨论】:

                    【解决方案12】:

                    如果有人在 VB.NET 中需要它:

                    Dim dataRow as DataRow
                    Dim yourNewDataTable as new datatable
                    For Each dataRow In yourArray
                         yourNewDataTable.ImportRow(dataRow)
                    Next
                    

                    【讨论】:

                      【解决方案13】:

                      你需要先克隆数据表的结构,然后使用for循环导入行

                      DataTable dataTable =dtExisting.Clone();
                      foreach (DataRow row in rowArray) {
                         dataTable.ImportRow(row);
                      }
                      

                      【讨论】:

                        【解决方案14】:
                        DataTable dataTable = new DataTable();
                        dataTable = OldDataTable.Tables[0].Clone();
                        foreach(DataRow dr in RowData.Tables[0].Rows)
                        {
                         DataRow AddNewRow = dataTable.AddNewRow();
                         AddNewRow.ItemArray = dr.ItemArray;
                         dataTable.Rows.Add(AddNewRow);
                        }
                        

                        【讨论】:

                          猜你喜欢
                          • 2014-07-23
                          • 2011-02-08
                          • 1970-01-01
                          • 2015-04-12
                          • 1970-01-01
                          • 2021-11-17
                          • 2017-03-02
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多