【问题标题】:Index out of bounds error accessing dataset table row访问数据集表行的索引越界错误
【发布时间】:2015-11-28 10:02:16
【问题描述】:

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

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 处具有值

有什么线索吗? 谢谢!

【问题讨论】:

    标签: c# asp.net dataset indexoutofboundsexception


    【解决方案1】:

    DataTable的Select方法返回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 方法来检查空值

    【讨论】:

      【解决方案2】:

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

      我猜你应该这样做:

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

      【讨论】:

        【解决方案3】:

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

        在这一行:

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

        您正在访问两个元素,分别位于第二个和第三个索引处。现在假设您的数据表有两行,那么您将收到 userRow[2] 的异常,因为它在数据表中不存在。

        检查返回的行数以及您正在访问的行数。

        希望这会有所帮助。

        【讨论】:

          【解决方案4】:

          您在索引 1 和索引 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;
          

          【讨论】:

          • 让我解释一下数组是如何工作的。它们是基于零的索引,因此计数从零开始。最后一个元素的索引是数组的长度减一。这些被称为数组的边界。如果您在边界之外使用索引,那么您将获得索引超出范围异常。因此,如果您的数组中有 4 个元素,则您的界限在 0 到 3 之间。您只能检索,例如用户行[0]、用户行[1]、用户行[2]、用户行[3]、
          猜你喜欢
          • 2014-06-06
          • 2015-03-22
          • 2017-12-14
          • 2013-10-13
          • 2015-01-10
          • 2014-01-27
          • 2017-07-26
          相关资源
          最近更新 更多