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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:30:48