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

我的问题很简单,但我仍然搜索了 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 方法,它根本不起作用。


慕的地6264312
浏览 296回答 2
2回答

慕森卡

您可以在参数值中传递 SQL 代码,但 SQL 引擎不会将其视为代码 - 因此它不会运行。这就是为什么使用参数可以保护您免受 SQL 注入的原因。但是,这并不意味着您不能忽略参数中传递的特定值,您只需要稍微更改 SQL 代码即可:SELECT * -- Note that best practice is to specify the columns list, not *FROM operationWHERE hospitalID = @hospitalIDOR @hospitalID IS NULL请注意,我已将其更改0为null- 因为该0值可能是有效值(即使 HospitalID 以 1 开头,您也可能希望对其他某些列使用相同的技术,其中0是有效值)。

www说

我想你对使用感到困惑 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);         }    }
打开App,查看更多内容
随时随地看视频慕课网APP