从数组到数据表

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

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。

正如chiffre所指出的,你实际上有3个问题:在开始添加行之前必须添加所有列,然后必须先创建DataRow才能将其添加到DataTable 。 你的第三个问题是你的行维度计数器caract+1会产生一个IndexOutOfRangeexception。

 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); } 

扩展方法怎么样?

 static class HappyExtEnding { public static DataTable ToDataTable(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 DataTable dtTmp = students.ToDataTable() ; 

一些问题:

  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); } 

详情请见此处 。

 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; } 

如果您有一个数组,其中第一行具有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; } 
  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]; } }