为了账号安全,请及时绑定邮箱和手机立即绑定

使用 AddWithValue 方法添加一个新的 where 子句

使用 AddWithValue 方法添加一个新的 where 子句

C#
慕的地6264312 2021-11-28 16:07:21
我的问题很简单,但我仍然搜索了 2 多个小时才能找到解决方案。在 C# 中,我有一个 where 子句:where ?hospitalID然后我将这个值(hospitalID)与我的条件绑定: cmd.Parameters.AddWithValue("?hospitalID", (filters.hospitalID != 0) ? "operation.hospitalID=" + filters.hospitalID : "true");所以我在这里要说的是:如果变量 filters.hospitalID 不为零,则继续创建条件 ( where operation.hospitalID=filters.hospitalID)。否则“无效”条件 ( where true)。如果我手动更改字符串,where operation.hospitalID=2它会起作用。但是使用 AddWithValue 方法,它根本不起作用。
查看完整描述

2 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

您可以在参数值中传递 SQL 代码,但 SQL 引擎不会将其视为代码 - 因此它不会运行。

这就是为什么使用参数可以保护您免受 SQL 注入的原因。


但是,这并不意味着您不能忽略参数中传递的特定值,您只需要稍微更改 SQL 代码即可:


SELECT * -- Note that best practice is to specify the columns list, not *

FROM operation

WHERE hospitalID = @hospitalID

OR @hospitalID IS NULL

请注意,我已将其更改0为null- 因为该0值可能是有效值(即使 HospitalID 以 1 开头,您也可能希望对其他某些列使用相同的技术,其中0是有效值)。


查看完整回答
反对 回复 2021-11-28
?
www说

TA贡献1775条经验 获得超8个赞

我想你对使用感到困惑 AddWithValue


假设这是我的查询


string sql = "SELECT * FROM SomeTable WHERE hospitalID=@ParamValue";

要替换ParamValue,我可以这样做:


using (SqlConnection conn = new SqlConnection())

using (SqlCommand cmd = new SqlCommand(sql, conn))

{

    cmd.Parameters.Add(new SqlParameter("ParamValue", someValue));

    da.Fill(ds);

}

这意味着,在您的情况下,您只需传递 value 而不是 statement operation.hospitalID=filters.hospitalID。


所以代码喜欢:


string sqlParam = "SELECT * FROM SomeTable WHERE hospitalID=@ParamValue";

string sqlWithoutParam = "SELECT * FROM SomeTable";

要替换ParamValue,我可以这样做:


    if(filters != null && filters.hospitalID != 0)

    {

        using (SqlConnection conn = new SqlConnection())

        using (SqlCommand cmd = new SqlCommand(sqlParam, conn))

        {

            cmd.Parameters.Add(new SqlParameter("ParamValue", filters.hospitalID ));

            da.Fill(ds);

        }

    }

    else

    {

         using (SqlConnection conn = new SqlConnection())

         using (SqlCommand cmd = new SqlCommand(sqlWithoutParam, conn))

         {

            da.Fill(ds);

         }

    }


查看完整回答
反对 回复 2021-11-28
  • 2 回答
  • 0 关注
  • 295 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信