You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查数据库中是否不存在指定用户名?遇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";
            }
        }
    }
}

关键修改说明

  1. 参数化查询:用@UserName参数代替字符串拼接,彻底避免SQL注入,同时能正确处理含特殊字符的用户名。
  2. 正确的存在性判断:通过sdr.Read()的返回值判断是否找到匹配数据——返回true表示用户存在,返回false则表示无匹配数据。
  3. 移除手动连接关闭:using语句会在代码块结束时自动释放连接资源,无需手动调用con.Close()。
  4. 输入内容去空格:用Trim()去除输入内容的前后空格,避免因用户误输入空格导致查询失败。

内容的提问来源于stack exchange,提问作者yee keong thewerid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:15:48