【问题标题】:Test for an empty DataRow in C#在 C# 中测试一个空的 DataRow
【发布时间】:2015-04-10 16:43:38
【问题描述】:

我正在尝试做的事情:我有一个大型数据表,我正在浏览一个字符串列表,其中一些在数据表中,而另一些则不在。我需要列出那些是的,并计算那些不是的。 这是我的代码部分:

DataRow[] foundRows;

foundRows = DTgesamt.Select("SAP_NR like '%"+SAP+"%'");
if (AreAllCellsEmpty(foundRows[0]) == false && !(foundRows[0]==null))
{
    list.Add(SAP);
}
else
{
   notfound++; 
}


public static bool AreAllCellsEmpty(DataRow row)
{
    if (row == null) throw new ArgumentNullException("row");

    for (int i = row.Table.Columns.Count - 1; i >= 0; i--)
    {
        if (!row.IsNull(i))
        {
            return false;
        }
    }

    return true;
}

DTgesamt 是一个大型数据表。 “SAP”是一个字符串,它位于 DataTable 的第一列,但并非所有这些都包括在内。我想用 int "notfound" 来计算未找到的那些。 问题是,当它什么也没找到时,Select 返回一个空的 DataRow {System.Data.DataRow[0]}。 我正在从数组区域中获取错误消息索引。 if 子句中的两个语句是我在互联网上看到的,但它们不起作用。只有第二个语句它只是将所有数字添加到列表中,第一个它仍然给出这个错误。 感谢您的帮助:)

【问题讨论】:

  • 您确定Select 返回并清空DataRow?我的意思是,如果您的“查询”返回一个空行集合,当您尝试访问该集合的位置 0 时,该过程将抛出异常。

标签: c# datatable datarow


【解决方案1】:

检查foundRows 数组中的项目计数以避免IndexOutOfRange 异常

foundRows = DTgesamt.Select("SAP_NR like '%"+SAP+"%'");
if (foundRows.Length > 0 && AreAllCellsEmpty(foundRows[0])==false)    
    list.Add(SAP);    
else    
    notfound++;    

【讨论】:

    【解决方案2】:

    找到的单元格不能为空。您的 select 语句将是错误的。所以你真正需要的是:

    if (DTgesamt.Select("SAP_NR like '%"+SAP+"%'").Any())
    {
        list.Add(SAP);
    }
    else
    {
       notfound++; 
    }
    

    您可能甚至不需要计数器,因为您可以根据您拥有多少 SAP 编号以及您在list 中获得多少结果来计算错过的记录。

    如果您有一个原始的 SAP 编号列表或数组,您可以将整个循环缩短为:

    var numbersInTable = originalNumbers.Where(sap => DTgesamt.Select("SAP_NR like '%"+sap+"%'").Any()).ToList();
    
    var notFound = originalNumbers.Count - numbersInTable.Count;
    

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      相关资源
      最近更新 更多