0

my DataRow object is emtpy no matter how I try to initialize it. Here is the source code:

private DataTable ReadFileIntoDb(MemoryStream file)
    {
        

        file.Position = 0;
        var sr = new StreamReader(file,Encoding.GetEncoding(1251),true);


        var dt = new DataTable();
        Console.WriteLine("datatable success");

        dt.Columns.Add(new DataColumn("description", typeof(String)));
        dt.Columns.Add(new DataColumn("code", typeof(String)));
        dt.Columns.Add(new DataColumn("cardnumber", typeof(String)));
        dt.Columns.Add(new DataColumn("costcentrecode", typeof(int)));
        dt.Columns.Add(new DataColumn("costcentre", typeof(String)));
        dt.Columns.Add(new DataColumn("article_description", typeof(String)));
        dt.Columns.Add(new DataColumn("trans_date", typeof(DateTime)));
        dt.Columns.Add(new DataColumn("article_price", typeof(Double)));
        dt.Columns.Add(new DataColumn("article_quantity", typeof(Double)));
        dt.Columns.Add(new DataColumn("netto", typeof(Double)));
        dt.Columns.Add(new DataColumn("brutto", typeof(Double)));
        dt.Columns.Add(new DataColumn("mwst", typeof(Double)));
        dt.Columns.Add(new DataColumn("beleg", typeof(Double)));
        dt.Columns.Add(new DataColumn("oberverkaufsgruppe", typeof(int)));


        dt.Columns.Add(new DataColumn("house", typeof(String)));
        dt.Columns.Add(new DataColumn("id", typeof(String)));


        //1. row gets skipped

        string line = sr.ReadLine();
        Console.WriteLine("line contains:" + line);
        line = sr.ReadLine();


        do
        {

            string[] itemArray = line.Split(';');
            DataRow row = dt.NewRow();

            row.ItemArray = itemArray; //doesnt work and throws ArgumentException    

            itemArray.CopyTo(row.ItemArray, 0); //doesnt work either

            for (int i = 0; i < 14; i++) //also doesnt work and leaves it empty
            {
                row.ItemArray[i] = itemArray[i];

                Console.WriteLine(row.ItemArray[i]);
            }


   

            row["id"] = Guid.NewGuid().ToString();
            row["house"] = "";

            dt.Rows.Add(row);


            line = sr.ReadLine();
        } while (!string.IsNullOrEmpty(line));

ReadFileIntoDb gets the content of a csv file as a parameter. Right now i reduced the csv content to only two lines which of one is just the header. The content looks like this and gets parsed successfully into var sr: Bewohner;1102284;1102284;42600;ASG ROT;Menü (Inklusivleistung);01.07.2022;0;1;;;;;2000003

As you can see this file contains 14 elements, some of which are empty. My DataTable also contains 14 columns and 2 additional which I set inside the code however and their values do not come from the csv. After performing the database operations my tables remain empty because I believe that row.ItemArray always remains empty so nothing gets added to the database. But I don't understand why it stays empty and why i get a ArgumentException. The source array itemArray is NOT empty and is also of length 14. So why does the exception get thrown if row.ItemArray is bigger in length? It has 16.

2
  • Are there any details in your Argument Exception? Commented Aug 19, 2022 at 9:05
  • yes it says the following: The array is larger than the number of columns in the table. This is simply not true in my opinion or atleast I have checked and came to a different conclusion. The table contains 16 columns. row.ItemArray also is of length 16 and itemArray has 14 elements. So there are more columns than elements inside iteamArray or the csv Commented Aug 19, 2022 at 9:15

1 Answer 1

1

Look into this ,I change the input string a bit

The line i added is

for (int i = 0; i < itemArray.Length; i++)
            {
                if (string.IsNullOrWhiteSpace(itemArray[i]))
                {
                    itemArray[i] = null;
                }
            }

for replacing the empty values as null in the given input , without this i got the error

Unhandled exception. System.ArgumentException: Input string was not in a correct format.Couldn't store <> in netto Column.  Expected type is Double.
 ---> System.FormatException: Input string was not in a correct format.
   at System.Number.ThrowOverflowOrFormatException(ParsingStatus status, TypeCode type)
   at System.String.System.IConvertible.ToDouble(IFormatProvider provider)
   at System.Data.Common.DoubleStorage.Set(Int32 record, Object value)
   at System.Data.DataColumn.set_Item(Int32 record, Object value)
   --- End of inner exception stack trace ---
   at System.Data.DataColumn.set_Item(Int32 record, Object value)
   at System.Data.DataRow.set_ItemArray(Object[] value)
   at Program.Main()
Command terminated by signal 6
using System;
using System.Data;
public class Program
{
    public static void Main()
    {
        string sp="Bewohner;1102284;1102284;42600;ASG ROT;Menü (Inklusivleistung);01.07.2022;0;1;;;;;2000003^Bewohner2;11022842;11022824;426200;ASG2 ROT;Menü (Inklusivleistung);01.07.2022;0;1;;;;;2000004";

        var dt = new DataTable();
        Console.WriteLine("datatable success");
        dt.Columns.Add(new DataColumn("description", typeof(String)));
        dt.Columns.Add(new DataColumn("code", typeof(String)));
        dt.Columns.Add(new DataColumn("cardnumber", typeof(String)));
        dt.Columns.Add(new DataColumn("costcentrecode", typeof(int)));
        dt.Columns.Add(new DataColumn("costcentre", typeof(String)));
        dt.Columns.Add(new DataColumn("article_description", typeof(String)));
        dt.Columns.Add(new DataColumn("trans_date", typeof(DateTime)));
        dt.Columns.Add(new DataColumn("article_price", typeof(Double)));
        dt.Columns.Add(new DataColumn("article_quantity", typeof(Double)));
        dt.Columns.Add(new DataColumn("netto", typeof(Double)));
        dt.Columns.Add(new DataColumn("brutto", typeof(Double)));
        dt.Columns.Add(new DataColumn("mwst", typeof(Double)));
        dt.Columns.Add(new DataColumn("beleg", typeof(Double)));
        dt.Columns.Add(new DataColumn("oberverkaufsgruppe", typeof(int)));


        dt.Columns.Add(new DataColumn("house", typeof(String)));
        dt.Columns.Add(new DataColumn("id", typeof(String)));

        string[] mainarray = sp.Split('^');
       for(int a=0;a<mainarray.Length;a++)
       {
            string[] itemArray = mainarray[a].Split(';');
            DataRow row = dt.NewRow();
            for (int i = 0; i < itemArray.Length; i++)
            {
                if (string.IsNullOrWhiteSpace(itemArray[i]))
                {
                    itemArray[i] = null;
                }
            }
            
            row.ItemArray = itemArray; //doesnt work and throws ArgumentException    

            itemArray.CopyTo(row.ItemArray, 0); //doesnt work either

            for (int i = 0; i < 14; i++) //also doesnt work and leaves it empty
            {
                row.ItemArray[i] = itemArray[i];

                //Console.WriteLine(row.ItemArray[i]);
            }
            row["id"] = Guid.NewGuid().ToString();
            row["house"] = "";

            dt.Rows.Add(row);
        }
        
foreach(DataRow dataRow in dt.Rows)
{var ix = 0;
    foreach(var item in dataRow.ItemArray)
    {
        Console.WriteLine(ix+"-----"+item);
        ix++;
    }
}           
    }
}

OUTPUT :

datatable success
0-----Bewohner
1-----1102284
2-----1102284
3-----42600
4-----ASG ROT
5-----Menü (Inklusivleistung)
6-----01/07/2022 00:00:00
7-----0
8-----1
9-----
10-----
11-----
12-----
13-----2000003
14-----
15-----ccf0a446-610e-4396-896d-7e8c4a43f729
0-----Bewohner2
1-----11022842
2-----11022824
3-----426200
4-----ASG2 ROT
5-----Menü (Inklusivleistung)
6-----01/07/2022 00:00:00
7-----0
8-----1
9-----
10-----
11-----
12-----
13-----2000004
14-----
15-----0c9cb9b1-8640-4626-8790-0d80fad9d8da
Sign up to request clarification or add additional context in comments.

2 Comments

one more question I have is why do you get the correct date 01/07/2022 and in my console output I get the day and month swapped to 07.01.2022 ??
i run in IST timezone., which timezone you are running?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.