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