我有这样的代码:
const string query = "select count(*) from query with parameters"
+ "@param1, @param2..."
(Obvioulsy是伪代码)。当我像这样运行查询时:
ctx.Database.SqlQuery<int>(query,
new SqlParameter("param1", idAsociacion),
new SqlParameter("param2", 0));
我得到一个例外,说明我没有为param2提供值。
如果我使用SQl服务器配置文件,我会看到生成的查询如下所示:
exec sp_executesql N'The query', @param1=N'P', @param2=default
如果我尝试直接在SQL Server中运行它,我也会收到错误,即param2是必需的而不是提供的(我不知道英语中的确切错误,因为我有一个本地化的SQL Server)。 / p>
为什么EF会将值0
转换为default
?
答案 0 :(得分:3)
问题是愚蠢的。
当我将鼠标指针放在VS中的这个构造函数调用时:
new SqlParameter("param2", 0)
我看到调用的SqlParameter
重载不是这个:
SqlParameter(string, object)
但是这个
SqlParameter(string, SqlDbType)
因此,简单的解决方案是调用构造函数将值转换为object,如下所示:
new SqlParameter("param2", (object)0)
因此调用了正确的重载,并且它按预期工作。