在C#中测试一个空的DataRow

时间:2015-04-10 08:34:19

标签: c# datatable datarow

我想要做的事情:我有一个很大的数据表,我会查看一个字符串列表,其中一些字符串位于数据表中,而另一些字符串则不存在。我需要列出那些那些,并计算那些不是。 这是我的代码部分:

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是一个大型DataTable。 " SAP"是一个字符串,位于DataTable的第一列,但不包括所有这些字符串。我想用int" notfound"来计算那些没有用的东西。 问题是,Select在没有找到任何内容时返回一个空的DataRow {System.Data.DataRow [0]}。 我从数组区域中获取了错误消息索引。 if子句中的两个陈述是我在互联网上读到的,但它们不起作用。只有第二个语句,它只是将所有数字添加到列表中,第一个仍然会出现此错误。 感谢您的帮助:))

2 个答案:

答案 0 :(得分:3)

检查foundRows数组中的项目数以避免IndexOutOfRange例外

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

答案 1 :(得分:0)

找到的细胞不能为空。你的选择陈述是错误的。所以你真正需要的是:

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;