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

如何使用OleDbDataReader从Access数据库获取ID列表

问题分析与解决方案

你的代码存在几个核心问题,导致无法正确提取ID并存储到字符串列表中:

  • 多余的行数查询:完全没必要先执行SELECT count(ID)获取行数,OleDbDataReader本身支持通过循环遍历所有行,适配行数不固定的场景。
  • 已释放的Reader操作:在using(reader = command.ExecuteReader())块结束后,Reader已经被自动销毁,但你后续还尝试调用这个已释放的Reader,必然引发异常。
  • 不必要的空格拼接:添加ID时额外加了空格,可能不符合你的实际需求。
  • 冗余的连接关闭:using(OleDbConnection)会自动管理连接的关闭,手动调用connection.Close()属于多余操作。

修正后的代码

public List<string> GetIDValueFromQuestionNumber(string quizNumber)
{
    List<string> resourceNames = new List<string>();
    try
    {
        string strSQL = $"SELECT ID FROM {quizNumber}";

        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {
            OleDbCommand command = new OleDbCommand(strSQL, connection);
            connection.Open();
            
            using (OleDbDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    // 先获取int类型ID再转字符串,避免类型转换异常
                    int id = reader.GetInt32(0);
                    resourceNames.Add(id.ToString());
                }
            }
        }
        
        return resourceNames;
    }
    catch (Exception e)
    {
        // 建议添加日志记录异常,而非直接返回null
        // 例如:Logger.Error($"获取ID失败: {e.Message}");
        return null;
    }
}

关键优化点

  1. 移除冗余的行数查询,直接通过while(reader.Read())遍历所有记录,适配任意行数的表。
  2. 使用reader.GetInt32(0)直接读取数值类型的ID,再转为字符串,比GetString更安全(避免数值转字符串的潜在异常)。
  3. 保留using语句自动释放OleDbConnection和OleDbDataReader资源,防止内存泄漏。
  4. 去掉不必要的空格拼接,确保ID字符串的纯净性。

内容的提问来源于stack exchange,提问作者Priception

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:27:45