【问题标题】:DataRow.ItemArray does not have values and is emptyDataRow.ItemArray 没有值并且为空
【发布时间】:2022-08-19 17:38:51
【问题描述】:

无论我如何尝试初始化它,我的 DataRow 对象都是空的。这是源代码:

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

读取文件到数据库获取 csv 文件的内容作为参数。现在我将 csv 内容减少到只有两行,其中一行只是标题。内容看起来像这样并成功解析为变种Bewohner;1102284;1102284;42600;ASG ROT;Menü (Inklusivleistung);01.07.2022;0;1;;;;;2000003

如您所见,该文件包含 14 个元素,其中一些是空的。我的 DataTable 还包含我在代码中设置的 14 列和 2 个附加列,但是它们的值并非来自 csv。 执行数据库操作后,我的表仍然为空,因为我相信 row.ItemArray 始终为空,因此没有任何内容添加到数据库中。但我不明白为什么它一直是空的以及为什么我得到一个 ArgumentException。源数组 itemArray 不为空,长度也为 14。那么,如果 row.ItemArray 的长度更大,为什么会抛出异常?它有 16 个。

  • 您的参数例外中有任何详细信息吗?
  • 是的,它说以下内容:数组大于表中的列数。在我看来,这根本不是真的,或者至少我已经检查并得出了不同的结论。该表包含 16 列。 row.ItemArray 的长度也是 16,而 itemArray 有 14 个元素。因此,iteamArray 或 csv 中的列多于元素

标签: c# database datarow system.data


【解决方案1】:

看看这个,我改变了输入字符串

我添加的行是

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

用于将给定输入中的空值替换为 null ,没有这个我得到了错误

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

输出 :

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

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2017-07-27
    • 1970-01-01
    相关资源
    最近更新 更多