【问题标题】:from array to datatable从数组到数据表
【发布时间】:2020-09-24 15:19:08
【问题描述】:

好吧,我现在假设很简单,你有一个多维数组,我尝试使用以下代码填充我的数据表:

System.Data.DataTable _myDataTable =new System.Data.DataTable();    
for (int j=0; j < ele; j++)
{       
        _myDataTable.Columns.Add();   

        for (int i = 0; i < caract+1; i++)
        {
            row[i]=(datar[j,i].ToString());

        }
        _myDataTable.Rows.Add(row);

}

我的数组名称是datar,但我收到错误:

 System.IndexOutOfRangeException: cant find column 1.

我做错了什么?顺便说一句:我使用的是 C#、asp.net,而不是 Visual Studio。

【问题讨论】:

  • 什么是“ele”?什么是“克拉克”?什么是“行”?什么是“数据”?
  • 你的代码太混乱了......我认为你应该阅读这个:msdn.microsoft.com/en-us/library/hfx3s9wd.aspx 然后这个:msdn.microsoft.com/en-us/library/5ycd1034(v=vs.80).aspx
  • I am using C#, asp.net, NOT Visual Studio. 接缝你钉,你了解每个产品:-/
  • 您是否尝试先创建列,然后再创建行?所以你会一次迭代j&lt;ele,然后你的2个嵌套循环来实际填充数据?
  • 忘记了:你在哪里实例化行?如我所见,该行始终为空,您尝试填写空行?!

标签: c# asp.net


【解决方案1】:

正如 chiffre 所指出的,您实际上有 3 个问题:您必须先添加所有列,然后才能开始添加行,并且您必须先创建一个 DataRow,然后才能添加它到您的DataTable。您的第三个问题是您的行维度计数器caract+1,它将产生一个 IndexOutOfRange 异常。

DataTable _myDataTable = new DataTable();

// create columns
for (int i = 0; i < ele; i++)
{
    _myDataTable.Columns.Add();
}

for (int j = 0; j < caract; j++)
{
    // create a DataRow using .NewRow()
    DataRow row = _myDataTable.NewRow();

    // iterate over all columns to fill the row
    for (int i = 0; i < ele; i++)
    {
        row[i] = datar[i, j];
    }

    // add the current row to the DataTable
    _myDataTable.Rows.Add(row);
}

【讨论】:

【解决方案2】:

扩展方法怎么样

static class HappyExtEnding
{
    public static DataTable ToDataTable<T>(this T [] students)
    {
        if (students == null || students.Length == 0) return null;

        DataTable table = new DataTable();
        var student_tmp = students[0];
        table.Columns.AddRange(student_tmp.GetType().GetFields().Select(field => new DataColumn(field.Name, field.FieldType)).ToArray());
        int fieldCount = student_tmp.GetType().GetFields().Count();

        students.All(student =>
        {
            table.Rows.Add(Enumerable.Range(0, fieldCount).Select(index => student.GetType().GetFields()[index].GetValue(student)).ToArray());
            return true;
        });

        return table;
    }
}

用法

Student[] students = {
     new Student { Id = 1, Name = "Joe Rattz", Address = "Sriram Apartments" },
     new Student { Id = 6, Name = "Ulyses Hutchens", Address = "Sriram Apartments" },
     new Student { Id = 19, Name = "Bob Tanko", Address = "Sriram Apartments" },
     new Student { Id = 45, Name = "Erin Doutensal", Address = "Sriram Apartments" },
     new Student { Id = 1, Name = "Joe Rattz", Address = "Sriram Apartments" },
     new Student { Id = 12, Name = "Bob Mapplethorpe", Address = "Sriram Apartments" },
     new Student { Id = 17, Name = "Anthony Adams", Address = "Sriram Apartments" },
     new Student { Id = 32, Name = "Dignan Stephens Mark", Address = "Sriram Apartments" },
     new Student { Id = 1232, Name = "Dignan Stephens", Address = "Sriram Apartments Henry Labamba Beligi" },
     new Student { Id = 132, Name = "Neha Dhupia", Address = "Sriram Apartments 123456" },
     new Student { Id = 132, Name = "", Address = "Sriram Apartments 123456" },
     new Student { Id = 133, Name = "", Address = "Sriram Apartments 123456" },
     new Student { Id = 134, Name = "Neha Dhupia", Address = "" },
     new Student { Id = 134, Name = "Shradha Kapoor", Address = "Mumbai" }
 };

 //ParallelQuery<int>

 DataTable dtTmp = students.ToDataTable() ;

【讨论】:

    【解决方案3】:

    一些问题:

    1. 您的代码未添加任何列
    2. 您的代码不添加任何行

    一步一步来。

    1. 添加列。

      //using System.Data
      DataTable _myDataTable = new DataTable();
      _myDataTable.Columns.Add(new DataColumn("Field_1"));
      _myDataTable.Columns.Add(new DataColumn("Field_2"));
      //...
      _myDataTable.Columns.Add(new DataColumn("Field_Ele"));
      
    2. 添加行。您需要从 _myDataTable 创建一个新的 Datarow,用数据填充它,将其添加到表中:

      //assuming your data are stored in datar[,]
      String[,] datar = new String[max_i, max_j];
      for (int i = 0; i < ele; i++)
      {
          DataRow r = _myDataTable.NewRow();
          for (int j = 0; j < caract; j++)
          {
              //mind casting issues
              r[j] = datar[i, j];
          }
          _myDataTable.rows.add(r);
      }
      

    详情请见here

    【讨论】:

    • 这也有效,唯一的问题是添加,在这部分我必须一个一个添加,但是假设我有 200 个我不想写 200 次添加,它会更好或同时
    • 您的表应该有数百列,不是吗?以及如何在 while 循环中指定正确的列名?
    • 来自客户,他首先指定要拥有多少列(我没有,因为它与我的问题无关),同时您添加一个从 0 开始的 conter 到 limit_of_columns 时虽然达到了它完成的极限
    • 如果数据存储在三个单独的List&lt;string&gt; 中,我需要将它们组合起来怎么办?
    【解决方案4】:
    public static DataSet MultidimensionalArrayToDataSet(string[,] input)
    {
        var dataSet = new DataSet();
        var dataTable = dataSet.Tables.Add();
        var iFila = input.GetLongLength(0);
        var iCol = input.GetLongLength(1);
    
        //Fila
        for (var f = 1; f < iFila; f++)
        {
            var row = dataTable.Rows.Add();
            //Columna
            for (var c = 0; c < iCol; c++)
            {
                if (f == 1) dataTable.Columns.Add(input[0, c]);
                row[c] = input[f, c];
            }
        }
        return dataSet;
    }
    

    【讨论】:

      【解决方案5】:

      如果您有一个数组,其中第一行包含 DataTable 列名,则可以使用。

          public static System.Data.DataTable ArrayToDataTable(Array array, bool headerQ=true)
          {
              if (array == null || array.GetLength(1) == 0 || array.GetLength(0) == 0) return null;
              System.Data.DataTable dt = new System.Data.DataTable();
              int dataRowStart = headerQ ? 1 : 0;
      
              // create columns
              for (int i = 1; i <= array.GetLength(1); i++)
              {
                  var column = new DataColumn();
                  string value = array.GetValue(1, i) is System.String
                      ? array.GetValue(1, i).ToString() : "Column" + i.ToString();
      
                  column.ColumnName = value;
                  dt.Columns.Add(column);
              }
              if (array.GetLength(0) == dataRowStart) return dt;  //array has no data
      
              //Note:  the array is 1-indexed (not 0-indexed)
              for (int i = dataRowStart + 1; i <= array.GetLength(0); i++)
              {
                  // create a DataRow using .NewRow()
                  DataRow row = dt.NewRow();
      
                  // iterate over all columns to fill the row
                  for (int j = 1; j <= array.GetLength(1); j++)
                  {
                      row[j-1] = array.GetValue(i,j);
                  }
      
                  // add the current row to the DataTable
                  dt.Rows.Add(row);
              }
              return dt;
          }
      

      【讨论】:

        【解决方案6】:
                var dt = new DataTable();
                var iFila = vals.GetLongLength(0);
                var iCol = vals.GetLongLength(1);
        
                for (var f = 1; f < iFila; f++)
                {
                    var row = dt.Rows.Add();
                    for (var c = 1; c <= iCol; c++)
                    {
                        if (f == 1) 
                            dt.Columns.Add(vals[1, c] != null 
                                ? vals[1, c].ToString() 
                                : "");
        
                        row[vals[1, c].ToString()] = vals[f, c];
                    }
                }
        

        【讨论】:

        • 不鼓励仅使用代码回答。请添加关于为什么此代码可能有效的解释。
        猜你喜欢
        • 2018-07-05
        • 1970-01-01
        • 2023-01-13
        • 2011-04-24
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多