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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:54:02