如何用SqlParameter构建WHERE后动态多条件SQL?解决报错问题
问题与解决方法
问题场景
需根据listView2中不确定数量的项,动态拼接SQL的WHERE条件查询数据库,原代码运行时抛出异常:
System.Data.SqlClient.SqlException: An expression of non-Boolean type is specified in the context in which the condition should be used (near '@para').
错误原因
SQL参数不能用来传递SQL语句片段,原代码把拼接好的条件字符串作为参数@para传入,数据库会将其视为普通字符串值,而非布尔判断条件,因此触发语法错误。
正确实现方式
动态拼接WHERE子句的条件结构,同时为每个条件值创建独立的SQL参数,既保证语法正确,又避免SQL注入风险:
修改后的代码
List<SqlParameter> parameters = new List<SqlParameter>(); StringBuilder whereClause = new StringBuilder(); for (int i = 0; i < listView2.Items.Count; i++) { string paramName = $"@account{i}"; if (i == 0) { whereClause.Append($"maccount = {paramName}"); } else { whereClause.Append($" OR maccount = {paramName}"); } parameters.Add(new SqlParameter(paramName, listView2.Items[i].Text)); } // 拼接完整SQL语句 string sql3 = "select maccount,msum from pharmaceutical_stocks"; if (whereClause.Length > 0) { sql3 += " WHERE " + whereClause.ToString(); } // 执行查询 DataTable dt = sqlcontent.dt(sql3, parameters.ToArray());
关键说明
- 使用
StringBuilder拼接条件,比普通字符串拼接更高效 - 为每个条件值创建独立参数(如
@account0、@account1),避免SQL注入 - 处理无条件的情况(当listView2为空时,不添加WHERE子句)
内容的提问来源于stack exchange,提问作者yoga
相关产品推荐
相关产品推荐

