如何使用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; } }
关键优化点
- 移除冗余的行数查询,直接通过
while(reader.Read())遍历所有记录,适配任意行数的表。 - 使用
reader.GetInt32(0)直接读取数值类型的ID,再转为字符串,比GetString更安全(避免数值转字符串的潜在异常)。 - 保留
using语句自动释放OleDbConnection和OleDbDataReader资源,防止内存泄漏。 - 去掉不必要的空格拼接,确保ID字符串的纯净性。
内容的提问来源于stack exchange,提问作者Priception
相关产品推荐
相关产品推荐

