C# 索引 0 为负数或高于 DataRowView 的行数 - 为什么?

问题描述

我知道这是一个典型的错误,但我不知道发生了什么。

我有一个数据集,然后在继续之前评估它是否已填充,如下所示:

if (
                    ds == null
                    || ds.Tables == null
                    || ds.Tables[0] == null
                    || ds.Tables[0].Rows.Count <= 0
                    )
                    return null;

                
                DaTarowView prd = ds.Tables[0].defaultview[0];

然后最后一行因以下错误而中断:

Type : system.indexOutOfRangeException,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089
Message : Index 0 is either negative or above rows count.
Source : System.Data
Help link : 
Data : System.Collections.ListDictionaryInternal
TargetSite : System.Data.DaTarow GetRow(Int32)
HResult : -2146233080
Stack Trace :
   at System.Data.DataView.GetRow(Int32 index)
   at System.Data.DataView.get_Item(Int32 recordindex)

鉴于我所做的评估,这怎么可能?我无法重现这个...

解决方法

这很奇怪:

ds.Tables[0].Rows.Count <= 0

我不记得曾经见过,也很难想象一个集合如何包含负数的项目..但无论如何

DataRowView prd = ds.Tables[0].DefaultView[0];

即使在您进行了所有检查之后,这仍然可能会爆炸,因为它需要视图中的第一行,即使表有行,这也可能不是问题(视图可能有一个过滤器,排除所有表格行的数量。也许你的意思是 ds.Tables[0].Rows[0];

,

您必须检查 DefaultView。它可能为 null 或为空