OleDbDataReader仅返回一行数据且报索引越界错误求助
解决OleDbDataReader读取Access数据时的索引越界问题
我一眼就揪出了代码里的两个关键问题,其中一个直接导致了你遇到的IndexOutOfRangeException:
核心错误点
错误的列索引引用
你的SQL语句只查询了一列PO.OptionID_FK,但读取数据时却用了r[i]——第一次循环i=0时,r[0]对应唯一的列,没问题;但第二次循环i=1时,你试图读取第2列(索引从0开始计数),而结果集根本没有这一列,这就直接触发了索引越界异常。你应该始终用r[0]或者更清晰的r["OptionID_FK"]来获取这唯一的列值。无效的
RowCount调用OleDbDataReader.RowCount在默认模式下(CommandBehavior.Default)会返回-1,因为它是向前只读的数据流,无法提前知晓总行数。这个变量对你的逻辑完全没用,可以直接删掉。
修正后的代码
if (passageID != 1) { Connect(fileName); OleDbCommand com = new OleDbCommand(); com.Connection = cxn; com.CommandText = "SELECT PO.OptionID_FK FROM PassageOption AS PO WHERE PO.PassageID_FK = @passageID;"; com.Parameters.AddWithValue("@passageID", passageID); OleDbDataReader r = com.ExecuteReader(); if (r.HasRows) { int i = 0; int[] optionIDs = new int[2]; while (r.Read()) { // 固定引用第0列,因为SQL仅返回一列数据 optionIDs[i] = (int)r[0]; i++; } // 加个校验确保确实读取到2行数据,避免数组未完全赋值就进行比较 if (i == 2) { j = optionIDs[0] < optionIDs[1] ? optionIDs[0] : optionIDs[1]; } else { // 处理返回行数不符的情况,比如赋值默认值或抛出提示 // j = 0; // 示例默认值 } } }
额外建议
虽然你说测试时SQL稳定返回2行,但实际场景中最好加上行数校验(比如上面代码里的i == 2判断),避免因为数据异常导致数组未完全赋值就进行比较,引发新的问题。
内容的提问来源于stack exchange,提问作者Duane Grech
相关产品推荐
相关产品推荐

