执行ExecuteStoreQuery时将通配符作为sqlparameter.Value传递

时间:2013-02-12 20:37:27

标签: c# sql-server asp.net-mvc

我正在使用数据库模型并尝试使用.ExecuteStoreQuery函数查询某些数据。

我的SQL语句看起来像这样

SELECT * FROM t WHERE f1 LIKE @pr1 AND f2 LIKE @pr2 AND f3 LIKE @pr3

现在你看到我使用3个参数:@ pr1,2,3

context.ExecuteStoreQuery(SQL_string,
new SqlParameter {
  ParameterName = "pr1",
  Value = filterVal1
},
new SqlParameter {
  ParameterName = "pr2",
  Value = filterVal2
},
new SqlParameter {
  ParameterName = "pr3",
  Value = filterVal3 == 0 ? filterVal3.ToString() : "%"
});

正如您所看到的,根据条件,我想使用filterVal3的实际值或通配符%,所以当执行sql语句时,它会根据其他2个参数选择记录。

问题是,“%”被翻译成我不期望的东西,并且查询返回空集。我试图在SQL_string中用'%'替换@ pr3,它实际上给了我所需的结果。

那么如何才能使用SqlParameter来实现它呢?

希望我很清楚。

3 个答案:

答案 0 :(得分:0)

我和Access DB有类似的问题 - 解决方案是用c#代码中的*替换%。 我不知道为什么会这样: - /

答案 1 :(得分:0)

您可以在存储过程中执行此操作

SELECT * 
FROM t 
WHERE f1 LIKE @pr1 + '%' 
    AND f2 LIKE '%' + @pr2 + '%' --if you want to search this way
    AND f3 LIKE @pr3 + '%'

答案 2 :(得分:0)

这里的问题是缺乏睡眠。

它实际上是按预期工作的。

。在搜索SO之前花了将近2个小时的谷歌搜索,现在我的眼睛已经开始了。

new SqlParameter {
  ParameterName = "pr3",
  Value = filterVal3 == 0 ? filterVal3.ToString() : "%"
});

这里的连续陈述是错误的。当我正在调试时,我期望filterVal3的值为0,在这种情况下,想法是在执行查询时“忽略”f3字段,但我意外地切换了true:false并导致错误的结果

正确的是:

new SqlParameter {
  ParameterName = "pr3",
  Value = filterVal3 != 0 ? filterVal3.ToString() : "%"
});

对不起那些浪费你时间的人:(