C#中MySqlDataReader.Read()循环无法执行问题求助
问题诊断与解决方案
你碰到的问题根源很明确:SQL查询里的变量没有正确传递给数据库,导致查询返回空结果,所以while (rdr.Read())循环根本不会执行。
具体错误点
看你的查询语句:
string query = "SELECT * FROM debtors WHERE NIC = 'id'";
这里的'id'是一个固定的字符串字面量,数据库会去查找NIC字段等于字符串"id"的记录,而不是你通过构造函数传入的id变量值!这就是为什么你确认变量无误,但还是查不到数据。
修复方案(推荐参数化查询)
解决这个问题最安全、规范的方式是使用参数化查询,它不仅能正确传递变量,还能避免SQL注入攻击:
namespace LoanApp { public partial class TablePopUp : Form { string id; public TablePopUp(string var) { id = var; InitializeComponent(); try { ConnectDB connection = new ConnectDB(); MySqlConnection con = connection.setUpConnection(); con.Open(); // 用参数占位符替代硬编码的字符串 string query = "SELECT * FROM debtors WHERE NIC = @NIC"; MySqlCommand cmd3 = new MySqlCommand(query, con); // 将变量绑定到参数 cmd3.Parameters.AddWithValue("@NIC", id); MySqlDataReader rdr = cmd3.ExecuteReader(); textBox1.Text = var.ToString(); while (rdr.Read()) { txtBoxSearch.Text = rdr.GetValue(1).ToString(); textBox2.Text = rdr.GetValue(5).ToString(); textBox3.Text = rdr.GetValue(4).ToString(); } rdr.Close(); con.Close(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } } }
额外注意事项
- 列索引检查:
rdr.GetValue(1)、rdr.GetValue(4)这些索引是从0开始的,要确认它们对应的数据表列确实是你需要的字段,如果列顺序有变化,建议改用列名读取(比如rdr["ColumnName"].ToString()),更健壮。 - 数据存在性验证:可以在执行查询后先判断
rdr.HasRows,如果为false可以提示用户"未找到匹配记录",提升用户体验。
不推荐的字符串拼接方式
虽然也可以用字符串插值拼接查询语句,但这种方式存在SQL注入风险,而且如果id包含单引号会直接报错,所以不建议使用:
// 不推荐,仅作示例 string query = $"SELECT * FROM debtors WHERE NIC = '{id}'";
内容的提问来源于stack exchange,提问作者Akalanka
相关产品推荐
相关产品推荐

