索引越界错误访问数据集 table 行
Index out of bounds error accessing dataset table row
当我尝试访问数据集 table 的一行中的值时,出现索引超出数组范围的错误。这是代码
DataRow[] userRow = newsdataset.Tables["users"].Select("Id = " + userid);
if (userRow != null && userRow.Length != 0)
{
string connectionName = userRow[1].ToString() + " " + userRow[2].ToString();
}
当我调试时,我可以看到 userRow 不为空并且它在数组中有值。
编辑 - 我应该添加 - 我没有混淆索引(我知道索引从 0 开始)我在尝试检索索引 1 和 2 时遇到错误,但在调试中我可以看到行数组的值位于索引 0、1、2 和 3
有线索吗?
谢谢!
你没有检查数组是否至少有3个元素,所以可能会出现这个异常。
此外,我不确定您是否熟悉它,但数组索引从零开始。
我猜你应该这样做:
string connectionName = userRow[0].ToString() + " " + userRow[1].ToString();
这可能是因为它可能有值,但它没有您请求的索引值。
这一行:
string connectionName = userRow[1].ToString() + " " + userRow[2].ToString();
您正在访问两个元素,分别位于第二个和第三个索引处。现在假设您的数据表有两行,那么您将获得 userRow[2]
的异常,因为它不存在于数据表中。
检查返回的行数和您正在访问的行。
希望对您有所帮助。
Select DataTable 的方法 returns DataRow[ 的数组=29=],DataRow 包含 DataColumn 的数组。
您已正确检查返回的数组是否不为空以及它是否包含至少一行,但是如果您想访问索引为零的那一行的内容,您需要使用两个索引,一个到 select 数组中的行和一个选择 selected 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 列称为 "Host",第 2 列称为 "Database",则
string connectionName = userRow[0]["Host"].ToString() + " " +
userRow[0]["Database"].ToString();
此外,如果这些列中可能存在空值,您应该了解如何使用 DataRow.IsNull 方法检查空值
您正在索引 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;
当我尝试访问数据集 table 的一行中的值时,出现索引超出数组范围的错误。这是代码
DataRow[] userRow = newsdataset.Tables["users"].Select("Id = " + userid);
if (userRow != null && userRow.Length != 0)
{
string connectionName = userRow[1].ToString() + " " + userRow[2].ToString();
}
当我调试时,我可以看到 userRow 不为空并且它在数组中有值。
编辑 - 我应该添加 - 我没有混淆索引(我知道索引从 0 开始)我在尝试检索索引 1 和 2 时遇到错误,但在调试中我可以看到行数组的值位于索引 0、1、2 和 3
有线索吗? 谢谢!
你没有检查数组是否至少有3个元素,所以可能会出现这个异常。 此外,我不确定您是否熟悉它,但数组索引从零开始。
我猜你应该这样做:
string connectionName = userRow[0].ToString() + " " + userRow[1].ToString();
这可能是因为它可能有值,但它没有您请求的索引值。
这一行:
string connectionName = userRow[1].ToString() + " " + userRow[2].ToString();
您正在访问两个元素,分别位于第二个和第三个索引处。现在假设您的数据表有两行,那么您将获得 userRow[2]
的异常,因为它不存在于数据表中。
检查返回的行数和您正在访问的行。
希望对您有所帮助。
Select DataTable 的方法 returns DataRow[ 的数组=29=],DataRow 包含 DataColumn 的数组。
您已正确检查返回的数组是否不为空以及它是否包含至少一行,但是如果您想访问索引为零的那一行的内容,您需要使用两个索引,一个到 select 数组中的行和一个选择 selected 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 列称为 "Host",第 2 列称为 "Database",则
string connectionName = userRow[0]["Host"].ToString() + " " +
userRow[0]["Database"].ToString();
此外,如果这些列中可能存在空值,您应该了解如何使用 DataRow.IsNull 方法检查空值
您正在索引 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;