当我尝试访问数据集表的一行中的值时,我得到一个超出数组错误的索引。这是代码
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的值任何线索? 谢谢!
答案 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;