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
相关产品推荐
相关产品推荐

