如何检查数据库中是否不存在指定用户名?遇InvalidOperationException报错求助
问题分析与解决
核心问题点
- 判断逻辑错误:你用
txt_Name.Text != null作为用户是否存在的判断条件,但文本框的Text属性永远不会为null(最多是空字符串),所以不管输入什么,这个条件都会成立,导致永远执行“找到用户”的分支。 - 未检查DataReader读取结果:直接调用
sdr.Read()后就去读取数据,当没有匹配的用户时,sdr.Read()会返回false,此时数据阅读器中没有数据,强行读取就会抛出InvalidOperationException。 - SQL注入风险:通过字符串拼接构造SQL语句,存在严重的安全漏洞。
- 多余的连接关闭:
using块会自动管理连接的生命周期,无需手动调用con.Close()。
修正后的代码
string constr = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\jettp\Downloads\MockTest\MockTest\Database1.mdf;Integrated Security=True"; using (SqlConnection con = new SqlConnection(constr)) { // 使用参数化查询避免SQL注入 using (SqlCommand cmd = new SqlCommand("SELECT Name, Weight FROM MyWeight WHERE Name = @UserName", con)) { // 添加参数并赋值,同时去除输入内容的前后空格 cmd.Parameters.AddWithValue("@UserName", txt_Name.Text.Trim()); cmd.CommandType = CommandType.Text; con.Open(); using (SqlDataReader sdr = cmd.ExecuteReader()) { // 通过sdr.Read()的返回值判断是否存在匹配数据 if (sdr.Read()) { MessageBox.Show("Username is found"); txt_Name.Text = sdr["Name"].ToString(); txt_Weight.Text = sdr["Weight"].ToString(); } else { // 未读取到数据,说明用户名不存在 lbl_WarningMsg.Text = "Name not found"; } } } }
关键修改说明
- 参数化查询:用
@UserName参数代替字符串拼接,彻底避免SQL注入,同时能正确处理含特殊字符的用户名。 - 正确的存在性判断:通过
sdr.Read()的返回值判断是否找到匹配数据——返回true表示用户存在,返回false则表示无匹配数据。 - 移除手动连接关闭:
using语句会在代码块结束时自动释放连接资源,无需手动调用con.Close()。 - 输入内容去空格:用
Trim()去除输入内容的前后空格,避免因用户误输入空格导致查询失败。
内容的提问来源于stack exchange,提问作者yee keong thewerid
相关产品推荐
相关产品推荐

