使用SqlDataReader读取SQL product表全部记录仅返回一条的问题求助
问题解决思路
你的代码只返回一条记录的核心原因是循环内多余调用了reader.NextResult()方法,具体说明和修复方案如下:
错误原因说明
reader.Read()方法的作用是定位到当前查询结果集的下一行记录,返回true代表还有可读记录,是遍历单结果集所有行的正确方法reader.NextResult()方法是用于处理多结果集的场景(比如一次执行多条SELECT语句),调用后会直接跳转到下一个结果集,丢弃当前结果集剩余未读的所有行- 你每次读取一行记录后就调用
NextResult(),你的查询只有1条SELECT语句、只有1个结果集,第一次调用后就没有可用结果集了,循环直接终止,自然只能拿到第一条记录
修复方案
直接删除while循环里的reader.NextResult();这行代码即可。同时可以对代码做如下优化:
- 不需要手动调用
reader.Close()、conn.Close(),using代码块结束后会自动释放对应资源,就算执行过程中出现异常也能正确释放,避免资源泄漏 - 补充
name不为空时的查询逻辑,当前代码只有name == null的分支有返回值,其余分支会出现编译错误或返回空集合 - 如果要实现按名称筛选的功能,建议使用参数化查询,避免SQL注入风险
修复后完整代码
public IReadOnlyList<Product> Search(string name) { var result = new List<Product>(); using (var conn = new SqlConnection(connectionString)) { conn.Open(); SqlCommand command; // 处理两种查询场景 if (name == null) { command = new SqlCommand("SELECT * FROM Product ", conn); } else { // 参数化查询避免注入,这里是示例,你可以按自己的需求调整模糊匹配规则 command = new SqlCommand("SELECT * FROM Product WHERE Name LIKE @Name", conn); command.Parameters.AddWithValue("@Name", $"%{name}%"); } using var reader = command.ExecuteReader(); while (reader.Read()) { var prod = new Product((int)reader["ID"], (string)reader["Name"], (double)reader["Price"], (int)reader["Stock"], (int)reader["VATID"], (string)reader["Description"]); result.Add(prod); } } return result; }
内容的提问来源于stack exchange,提问作者Yassine Mrabet
相关产品推荐
相关产品推荐

