MySqlDataReader执行查询仅返回第一行数据问题咨询
问题原因
- 你的
GetAllProducts方法在while (rdr.Read())循环内部直接执行了return语句,程序读到第一条查询结果时就会直接退出方法,后续3条数据完全不会进入遍历逻辑,因此只能返回第一条记录。 - 额外隐藏问题:当前代码没有做非托管资源的自动释放,若查询过程中抛出异常,可能出现数据库连接未正常关闭的资源泄漏问题。
修复方案
- 新增一个字符串拼接容器(推荐用
StringBuilder,性能远优于循环内直接做字符串拼接),遍历所有查询结果时把每条记录追加到容器中,遍历完成后再统一返回结果 - 用
using语句包裹MySqlConnection、MySqlCommand、MySqlDataReader对象,自动完成资源释放,无需手动调用Close方法,规避资源泄漏风险
修复后的参考代码如下:
public string GetAllProducts() { string connStr = "server=localhost;user=root;database=tp1;port=3306;password="; // 使用using自动释放连接资源 using MySqlConnection conn = new MySqlConnection(connStr); try { Console.WriteLine("Connecting to MySQL..."); conn.Open(); string sql = "SELECT * FROM material"; // 使用using自动释放命令对象资源 using MySqlCommand cmd = new MySqlCommand(sql, conn); // 使用using自动释放DataReader资源 using MySqlDataReader rdr = cmd.ExecuteReader(); // 定义StringBuilder存储所有结果 StringBuilder resultSb = new StringBuilder(); while (rdr.Read()) { // 追加每条记录,每条之间用换行分隔,可根据需要调整分隔符 resultSb.AppendLine($"{rdr[0]} -- {rdr[1]} -- {rdr[2]} -- {rdr[3]}"); } // 遍历完成后判断是否有结果,返回对应内容 return resultSb.Length > 0 ? resultSb.ToString().TrimEnd() : "No records found"; } catch (Exception ex) { Console.WriteLine(ex.ToString()); return $"Query failed: {ex.Message}"; } // using会自动关闭连接,不需要手动写conn.Close() Console.WriteLine("Done."); }
内容的提问来源于stack exchange,提问作者Diogo Pinto
相关产品推荐
相关产品推荐

