SQL Server 如何使用SqlParameter定义一个完整的条件语句where after'where '?

xyhw6mcr  于 2022-11-28  发布在  其他
关注(0)|答案(2)|浏览(184)

我想通过字符串的链接实现,在where后面定义一个完整的SQL语句条件,因为我不确定where后面有多少条件。

for (int i = 0; i < listView2.Items.Count; i++)
{
    if (!is_first)
    {
        para += "maccount" +" "+ "=" + listView2.Items[i].Text;
        is_first = true;
    }
    else
    {
        para += " or "  + "maccount"+"="+ listView2.Items[i].Text;
    }
}

MessageBox.Show(para);

string sql3 = "select maccount,msum from pharmaceutical_stocks where @para";

SqlParameter[] parameters3 = new SqlParameter[]
{
    new SqlParameter("@para",para)
};

DataTable dt = sqlcontent.dt(sql3, parameters3);

我想通过保存在listview 2中的每个项目中的信息来查找数据库中的数据。
但我得到这个例外:
System.Data.SqlClient.SqlException:在应使用条件的上下文中指定了非布尔类型的表达式(在“@ para”附近)。

bmp9r5qi

bmp9r5qi1#

上面的代码无法工作!
参数不能用于替换查询中的文本块,无论文本是列名、表名、运算符还是上述元素的某种组合。
它们只能用于将传输到数据库引擎,在数据库引擎中,它们可以与查询文本和查询中的占位符一起正确使用,而无需进行文本替换操作。您应该使用IN子句并构建一个参数数组。单参数占位符可以通过代码在内部连接字符串来构造,而无需担心SQL注入。
最后,在查询文本中插入参数占位符(而不是值),并将包含所有已定义参数的列表传递给方法

StringBuilder inText  = new StringBuilder();
List<SqlParameter> prms = new List<SqlParameter>();
for(int i = 0; i < listView2.Items.Count; i++)
{
    SqlParameter p = new SqlParameter("@p" + i, SqlDbType.NVarChar);
    p.Value = listView2.Items[i].Text;
    prms.Add(p);
    inText.Append($"@p{i},");
}
if(inText.Length > 0) inText.Length--;
string sql3 = $@"select maccount,msum 
                from pharmaceutical_stocks 
                where maccount in({inText.ToString()})";
DataTable dt = sqlcontent.dt(sql3, prms.ToArray());
dhxwm5r4

dhxwm5r42#

我的代码背后的想法与Steve的答案相同,但我建议使用string.Join来构建params字符串。假设parameters是SqlParameter[]

const string sql = "select maccount, msum from pharmaceutical_stocks where maccount in ({0})";
string sqlCommand = string.Format(sql, string.Join(",", parameters.Select(p => p.ParameterName)));

这样你就不用担心逗号了,你唯一要检查的是listView2中是否真的有一些条目

相关问题