You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OleDbDataReader仅返回一行数据且报索引越界错误求助

解决OleDbDataReader读取Access数据时的索引越界问题

我一眼就揪出了代码里的两个关键问题,其中一个直接导致了你遇到的IndexOutOfRangeException:

核心错误点

  1. 错误的列索引引用
    你的SQL语句只查询了一列PO.OptionID_FK,但读取数据时却用了r[i]——第一次循环i=0时,r[0]对应唯一的列,没问题;但第二次循环i=1时,你试图读取第2列(索引从0开始计数),而结果集根本没有这一列,这就直接触发了索引越界异常。你应该始终用r[0]或者更清晰的r["OptionID_FK"]来获取这唯一的列值。

  2. 无效的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:13:25