C#操作MySQL数据库如何校验用户名存在性及密码正确性
现有代码的问题
- 你的SQL查询语句是同时匹配用户名和密码,只要返回结果为空,根本无法区分是用户名不存在,还是用户名存在但密码错误
ExecuteScalar()的使用完全错误:你执行的是select *语句,ExecuteScalar()会返回结果集第一行第一列的字段值,不是匹配的行数,直接强转int大概率会触发运行时异常- 同时用
MySqlDataAdapter填充DataTable和调用ExecuteScalar()属于重复执行查询,完全没必要
修正后的实现逻辑
先单独查询对应用户名的记录,再判断密码是否匹配,代码如下:
String connectionString = @"Data Source=localhost; Database=pramod; User ID=itesuser; password=ites; Port=3309;"; // 用using自动释放连接资源,无需手动调用Close using (MySqlConnection con = new MySqlConnection(connectionString)) { con.Open(); // 仅按用户名查询对应密码 String query = "select PASSWORD from logins where USERNAME=@username"; MySqlCommand cmd = new MySqlCommand(query, con); cmd.Parameters.AddWithValue("@username", TextBox1.Text.Trim()); object dbPwdObj = cmd.ExecuteScalar(); // 查询结果为空说明用户名不存在 if (dbPwdObj == null) { Response.Write("username wrong"); return; } // 用户名存在,校验密码是否匹配 string inputPwd = TextBox2.Text.Trim(); string dbPwd = dbPwdObj.ToString(); if (inputPwd == dbPwd) { Session["username"] = TextBox1.Text.Trim(); Response.Redirect("Dashboard.aspx"); } else { Label1.Visible = true; Label1.Text = "Your password is incorrect"; Label1.ForeColor = System.Drawing.Color.Red; } }
额外注意事项
- 生产环境绝对不能明文存储密码,需要将密码做哈希加盐处理后存入数据库,校验时对比哈希值即可
- 用using包裹数据库连接对象可以自动处理资源释放,避免连接泄漏
内容的提问来源于stack exchange,提问作者NPK
相关产品推荐
相关产品推荐

