Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

from array to datatable

Tags:

c#

asp.net

ok i now it supose to be simple y have a multidimensional array, I try to fill my data table using the following code:

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

}

My array name is datar but the error I receive:

 System.IndexOutOfRangeException: cant find column 1.

What am I doing wrong? By the way: I am using C#, asp.net, NOT Visual Studio.

like image 588
JUAN Avatar asked Jul 04 '12 14:07

JUAN


2 Answers

As pointed out by chiffre you actually have 3 problems: You will have to add all columns before you can start to add rows and you will have to create a DataRow before you can add it to your DataTable. Your third problem is your row-dimension counter caract+1 which will yield an IndexOutOfRange exception.

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);
}
like image 164
Filburt Avatar answered Sep 30 '22 10:09

Filburt


How about an extension method

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

Usage

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() ;
like image 43
Dr.sai Avatar answered Sep 30 '22 12:09

Dr.sai