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

时间:2018-08-14 13:09:48

标签: c# sql

我的问题很简单,但仍然需要2个多小时才能找到解决方案。 在C#中,我有一个where子句:where ?hospitalID,然后将此值(hospitalID)与我的条件绑定:

 cmd.Parameters.AddWithValue("?hospitalID", (filters.hospitalID != 0) ? "operation.hospitalID=" + filters.hospitalID : "true");

所以我在这里说的是:如果变量filter.hospitalID不为零,则继续创建条件(where operation.hospitalID=filters.hospitalID)。否则“取消”条件(where true)。

如果我手动更改字符串where operation.hospitalID=2,它将起作用。但是使用AddWithValue方法,它根本不起作用。

2 个答案:

答案 0 :(得分:2)

您可以在参数值内部传递SQL代码,但是SQL引擎不会将其视为代码-因此它将无法运行。
这就是使用参数保护您免受SQL注入的原因。 有关更详细的说明,请read this SO post

但是,这并不意味着您不能忽略在参数中传递的特定值,您只需要稍微更改一下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是有效值的其他列的使用技巧。

答案 1 :(得分:0)

我认为您对使用filename: newFOTD.js var csvfile = '../data/flavorDB.csv';

感到困惑

假设这是我的查询

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); }

所以代码喜欢:

operation.hospitalID=filters.hospitalID

要替换string sqlParam = "SELECT * FROM SomeTable WHERE hospitalID=@ParamValue"; string sqlWithoutParam = "SELECT * FROM SomeTable"; ,我可以做:

ParamValue