【问题标题】:Data Table Getting error when i add data rows[]添加数据行时数据表出现错误[]
【发布时间】:2014-02-18 08:30:31
【问题描述】:
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Date", typeof(String)));
dt.Columns.Add(new DataColumn("Time", typeof(String)));
dt.Columns.Add(new DataColumn("Function", typeof(String)));
dt.Columns.Add(new DataColumn("Log Level", typeof(String)));
dt.Columns.Add(new DataColumn("Message", typeof(String)));

当我查询 DataTable 然后得到DataRows[]

DataRow[] result = dt.Select("Function ='" + strfunction + "'");

现在我想将该结果添加到 DataTable

dt.Rows.Add(result);

但是我遇到了错误

输入数组长于该表的列数。

【问题讨论】:

  • 我认为错误信息很清楚。看起来您的 result 具有多个 5 列,这就是您收到错误的原因,因为您的 dt 具有 5 列。也显示你的dTSearchIn..
  • 我在同一个表中搜索以及如何获得比它更多的列
  • 什么是dTSearchIn,为什么t是大写?
  • 这是我正在搜索的数据表
  • 您在 dTSearchIn 中搜索,而不是在 dt 中搜索。检查 dTSearchIn 的架构。它应该包含超过 5 列。否则,请编辑您的问题,为我们提供 dTSearchIn 的架构。

标签: c# datatable


【解决方案1】:

试试这个

foreach (DataRow row in result)
    dt.Rows.Add(row);

【讨论】:

  • 这将给出错误:该行已经属于该表。。请设为dt.Rows.Add(row.ItemArray);
  • foreach 中缺少 row = dt.NewRow();
【解决方案2】:

DataRowCollection.Add() 有两个重载

  • Add(DatarRow row);
  • Add(params object[] values);

您当前使用的是Add(params object[] values);,因为您正在传递一个基类为object 的类的数组。所以你在同一个表中搜索,确实得到相同数量的列,但问题是;您希望数组的每个元素插入DataRow,但只插入一行,并且数组DataRow[] result 的每个元素都分配给@ 987654328@

与:

dt.Rows.Add(new object[] { "Date", "Time", "a", "Log Level", "Message" });
DataRow[] result = dt.Select("Function ='a'");

foreach (DataRow r in dt.Rows)
{
    /* Log r or inpect */
}

在我的测试中没有抛出异常,因为 result 数组只有 1 个元素(作为搜索结果)。

如果我在result 中有超过 5 个元素;因为我不能在 5 列表中插入 6 列值,所以会抛出异常。

正确的做法是interating搜索结果数组并为每个数组元素添加一个新行;使用DataRow.ItemArray 属性

您可以尝试以下对我有用的方法:

DataRow[] result = dt.Select("Function ='" + strfunction + "'");

foreach (DataRow r in result)
{
    dt.Rows.Add(r.ItemArray);
}

【讨论】:

    【解决方案3】:

    与其直接将DataRow 添加到DataTable,不如创建一个foreach 循环并从DataTable 创建一个单独的DataRow,填充数据并将其添加到DataTable。例如:

    DataTable dt = new DataTable();
    dt.Columns.Add(new DataColumn("Date", typeof(String)));
    dt.Columns.Add(new DataColumn("Time", typeof(String)));
    dt.Columns.Add(new DataColumn("Function", typeof(String)));
    dt.Columns.Add(new DataColumn("Log Level", typeof(String)));
    dt.Columns.Add(new DataColumn("Message", typeof(String)));
    
    //Dummy data added
    DataRow dr = dt.NewRow();
    dr[0] = "aa";
    dr[1] = "bb";
    dr[2] = "cc";
    dr[3] = "dd";
    dr[4] = "ee";
    
    dt.Rows.Add(dr);
    
    string strfunction = "cc";
    DataRow[] result = dt.Select("Function ='" + strfunction + "'");
    
    //Initialize Datarow here. I am using the one which is defined above
    dr = null;
    
    foreach (var item in result)
    {
        dr = dt.NewRow();
        dr[0] = item[0];
        dr[1] = item[1];
        dr[2] = item[2];
        dr[3] = item[3];
        dr[4] = item[4];
    
        dt.Rows.Add(dr);
    }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多