MySQL连接成功后报错:C#登录代码异常排查
问题排查与解决方案
核心错误原因
代码中SQL查询的字段名与实际数据库表字段不匹配:
- 代码里用了
name和exact_password,但实际core_members表的字段是member_name和member_password,这会导致SQL执行出错,触发异常。
其他潜在问题
- 使用字符串拼接SQL语句,存在严重的SQL注入风险,同时如果用户输入包含单引号等特殊字符,会直接导致SQL语法错误。
- 调用
cmd.ExecuteNonQuery()执行SELECT语句:该方法仅适用于增删改操作,执行SELECT会返回-1,且完全多余,DataAdapter的Fill方法会自动执行查询命令。 - 异常处理仅显示通用提示,无法获取具体错误信息,不利于排查问题。
- 数据库连接未使用
using语句管理,可能导致连接资源无法及时释放。
修正后的完整代码
using MySql.Data.MySqlClient; using System.Data; using System.Windows.Forms; // 登录按钮点击事件方法内的代码 string server = "s570.use8.mysecurecloudhost.com"; string database = "nextgene_NGH"; string uid = "nextgene_NGH"; string password = "EXAMPLE PASSWORD"; string ssl = "None"; string connectionString = $"SERVER={server};DATABASE={database};UID={uid};PASSWORD={password};SSL Mode={ssl}"; try { // 使用using自动释放连接资源 using (MySqlConnection connection = new MySqlConnection(connectionString)) { connection.Open(); MessageBox.Show("Connection Successful!"); // 参数化查询,避免SQL注入和语法错误 string sql = "SELECT * FROM `core_members` WHERE member_name = @username AND member_password = @password"; using (MySqlCommand cmd = new MySqlCommand(sql, connection)) { // 添加参数 cmd.Parameters.AddWithValue("@username", maskedTextBox1.Text); cmd.Parameters.AddWithValue("@password", maskedTextBox2.Text); DataTable dt = new DataTable(); using (MySqlDataAdapter da = new MySqlDataAdapter(cmd)) { da.Fill(dt); } if (dt.Rows.Count == 0) { MessageBox.Show("Login Failed."); //button2.Visible = true; } else { MessageBox.Show("Login Successful."); } } } } catch (Exception ex) { // 显示具体异常信息,方便排查 MessageBox.Show($"Error: {ex.Message}\n{ex.StackTrace}"); }
关键修正点说明
- 修正字段名:将SQL中的
name改为member_name,exact_password改为member_password,匹配实际表结构。 - 参数化查询:用
@username和@password作为参数占位符,通过Parameters.AddWithValue传入用户输入,彻底避免SQL注入,同时解决特殊字符导致的语法错误。 - 移除多余的ExecuteNonQuery:DataAdapter的
Fill方法会自动执行查询,无需提前调用ExecuteNonQuery。 - 使用using语句:确保连接、命令、适配器等资源在使用后自动释放,避免资源泄漏。
- 完善异常提示:显示具体的错误信息和堆栈跟踪,便于快速定位问题。
内容的提问来源于stack exchange,提问作者Ryan Ellis
相关产品推荐
相关产品推荐

