C#中While循环内IF条件异常:False值仍循环,Else分支始终弹窗
解决While循环中Else分支总是触发的问题
兄弟,我一眼就看出你这问题大概率是循环逻辑或者查询语句的设计出了问题,咱们一步步拆解解决:
问题根源
你现在用select * from wp_users查询所有用户,然后在while(myReader.Read())里逐个判断用户名密码——这就导致每一条不匹配的用户记录都会触发else分支弹出对话框,哪怕已经找到匹配的用户,后面不匹配的记录还是会执行else。另外C#里根本没有while...else这种语法,要是你把else直接写在while循环外面,那不管循环有没有找到匹配项,循环结束后都会跑else的代码。
最优解决方案:用参数化查询直接定位匹配用户
别查所有用户了,直接用带参数的SQL语句只找匹配的记录,既高效又安全(还能防SQL注入),代码这么改:
MySqlConnection conn = new MySqlConnection(); string query = "server=sample.com;port=3306;database=sample;user id=sample;password=sample"; conn.ConnectionString = query; // 用参数化查询,绝对别直接拼用户名密码到SQL里! string sql = "SELECT * FROM wp_users WHERE user_login = @Username AND user_pass = @Password"; MySqlCommand cmd = new MySqlCommand(sql, conn); // 替换成你实际获取的输入用户名和密码 cmd.Parameters.AddWithValue("@Username", inputUsername); cmd.Parameters.AddWithValue("@Password", inputPassword); try { conn.Open(); MySqlDataReader myReader = cmd.ExecuteReader(); if(myReader.HasRows) { // 找到匹配用户,登录成功 myReader.Read(); MessageBox.Show("登录成功!"); // 这里可以加登录后的逻辑,比如存用户ID之类的 } else { // 没找到匹配的,弹错误提示 AlertDialog.Show("登录失败,用户名或密码错误"); } myReader.Close(); } catch(Exception ex) { // 处理数据库异常 MessageBox.Show("数据库出错啦:" + ex.Message); } finally { conn.Close(); // 一定要关连接 }
如果非得遍历所有用户(不推荐)
要是你因为特殊需求必须遍历所有用户,那得整个标记变量,找到匹配的就标记成功,循环结束后再判断:
bool loginSuccess = false; MySqlDataReader myReader = cmd.ExecuteReader(); while(myReader.Read()) { string user1 = myReader["user_login"].ToString(); string pass1 = myReader["user_pass"].ToString(); if(user1 == inputUsername && pass1 == inputPassword) { loginSuccess = true; break; // 找到就赶紧跳出循环,别浪费性能 } } if(loginSuccess) { // 登录成功逻辑 } else { AlertDialog.Show("登录失败,用户名或密码错误"); }
额外提醒
- 一定要用参数化查询,直接拼字符串会被SQL注入,后果很严重!
- 最好用
using语句自动释放数据库资源,不用手动关连接和Reader,比如:using(MySqlConnection conn = new MySqlConnection(query)) { using(MySqlCommand cmd = new MySqlCommand(sql, conn)) { // 这里写查询逻辑 } }
内容的提问来源于stack exchange,提问作者Jayson E Garcia
相关产品推荐
相关产品推荐

