访问数据集表行的索引越界错误

时间:2015-11-28 10:02:16

标签: c# asp.net dataset indexoutofboundsexception

当我尝试访问数据集表的一行中的值时,我得到一个超出数组错误的索引。这是代码

DataRow[] userRow = newsdataset.Tables["users"].Select("Id = " + userid);
if (userRow != null && userRow.Length != 0)
{
    string connectionName = userRow[1].ToString() + " " + userRow[2].ToString();
}  

当我调试时,我可以看到userRow不是null并且它在数组中有值。

编辑 - 我应该添加 - 我没有混合索引(我知道索引从0开始)当我尝试检索索引1和2时我有错误,但在调试中我可以看到该行数组具有索引0,1,2和3的值

任何线索? 谢谢!

4 个答案:

答案 0 :(得分:1)

DataTable 选择方法返回 DataRow 数组,DataRow包含 DataColumn 。

您已正确检查返回的数组是否为空且是否包含至少一行,但如果要在索引零处访问该行的内容,则需要使用两个索引,一个用于选择行中的数组和一个选择DataRow中感兴趣的列。

DataRow[] userRow = newsdataset.Tables["users"].Select("Id = " + userid);
if (userRow != null && userRow.Length != 0)
{
    string connectionName = userRow[0][1].ToString() + " " + userRow[0][2].ToString();
}  

您的代码尝试读取返回数组的第二个和第三个DataRow,而不是第一行的第二和第三列。当然,这会触发异常,因为 userRow 数组中没有第二行或第三行。 (更好地将这个名称复数化,我敢打赌,这就是旁边跟踪了很多答案)

还要考虑您可以使用 ColumnName 属性访问列。如果按照检索列的顺序发生变化,这会使您的代码不易出错。假设第1列称为“主机”,第2列称为“数据库”,然后是

 string connectionName = userRow[0]["Host"].ToString() + " " + 
                         userRow[0]["Database"].ToString();

此外,如果这些列中可能存在空值,您应该看看如何使用DataRow.IsNull方法检查空值

答案 1 :(得分:0)

您尚未检查该阵列至少有3个项目,因此可能会发生此异常。 此外,我不确定你是否熟悉它,但数组索引从零开始。

我猜你应该这样做:

string connectionName = userRow[0].ToString() + " " + userRow[1].ToString();

答案 2 :(得分:0)

这可能是因为它可能有值,但它没有您要求的索引值。

在这一行:

string connectionName = userRow[1].ToString() + " " + userRow[2].ToString();

您正在分别访问第二个和第三个索引处的两个元素。现在让我们假设您的数据表有两行,那么userRow[2]会得到一个例外,因为它不存在于数据表中。

检查返回的行数和您要访问的行。

希望这有帮助。

答案 3 :(得分:0)

您正在检索at,index 1和index 2.您的结果可能只包含2个元素或少于2个元素,在这种情况下,您将获得异常。你应该在索引0和索引1开始检索,而不是

DataRow[] userRow = newsdataset.Tables["users"].Select("Id = " + userid);
if (userRow != null && userRow.Length != 0)
{
    string connectionName = userRow[0].ToString() + " " + userRow[1].ToString();
}

更好的解决方案是循环如下,以避免数组索引超出绑定异常。因为您的索引将始终在数组的范围内

DataRow[] userRow = newsdataset.Tables["users"].Select("Id = " + userid);
if (userRow != null && userRow.Length != 0)
{
     string connectionName = string.Empty;
     for( int i = 0; i < userRow.Length; i++)
     { 
         connectionName += userRow[i].ToString() + " ";
      }
} 
var result = connectionName;