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

ASP.NET 4.8用户管理项目SQL查询过滤功能失效原因咨询

问题诊断及修正方案

你代码存在SQL逻辑错误、代码冗余和不规范两部分问题,具体如下:

SQL查询错误及成因

  • 逻辑运算符优先级错误:SQL中AND优先级高于OR,你当前写法等价于(姓名匹配) OR (员工号匹配 AND 未排除),和你预期的(姓名匹配 OR 员工号匹配) AND 未排除逻辑完全不符,缺少对OR条件组的括号包裹。
  • 不必要的类型转换:excluded是bit类型,直接用excluded = 0即可筛选未排除的用户,转字符串后用LIKE匹配属于冗余操作,还会导致索引失效,查询效率大幅降低。
  • 参数闲置:你声明了@Excluded参数,但SQL语句中完全没有使用该参数,参数定义无效。

C#代码错误及成因

  • 重复执行查询:三次调用da.Fill会让同一条查询语句执行三次,属于完全冗余操作,只需填充一次DataSet即可。
  • 多余的查询调用:ExecuteNonQuery仅用于增删改操作,查询场景下调用无任何作用,反而会多执行一次无意义的查询。
  • 资源泄漏风险:SqlConnection、SqlCommand、SqlDataAdapter均实现了IDisposable接口,未使用using块自动释放资源,会导致连接池资源被占用。
  • 数据源绑定错误:填充DataSet时指定的表名与查询结果不符,绑定GridView时可能出现数据匹配错误。

修正后完整代码

void PopulateGridView()
{
    // 修正后的SQL:OR条件加括号,直接筛选excluded状态,使用@Excluded参数方便后续切换筛选逻辑
    string find = @"SELECT * FROM TBL_USERS 
                    WHERE (Name LIKE '%' + @Name + '%' OR employee LIKE '%' + @Employee + '%') 
                    AND excluded = @Excluded";
    using (SqlCommand comm = new SqlCommand(find, con))
    {
        comm.Parameters.Add("@Name", SqlDbType.VarChar, 255).Value = TextBox1.Text.Trim();
        comm.Parameters.Add("@Employee", SqlDbType.VarChar, 32).Value = TextBox1.Text.Trim();
        comm.Parameters.Add("@Excluded", SqlDbType.Bit).Value = 0; // 赋值0筛选未排除用户,需要筛已排除用户时改赋值为1即可
        con.Open();
        SqlDataAdapter da = new SqlDataAdapter(comm);
        DataSet ds = new DataSet();
        da.Fill(ds, "TBL_USERS"); // 仅需填充一次
        gvTestUsers.DataSource = ds.Tables["TBL_USERS"]; // 指定正确数据表绑定
        gvTestUsers.DataBind();
        con.Close();
    }
}

内容的提问来源于stack exchange,提问作者Måns Bodin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:54:02