【问题标题】:Entity Framework buggy when invoking stored procedure via Database.SqlQuery通过 Database.SqlQuery 调用存储过程时出现实体框架错误
【发布时间】:2018-01-10 16:46:36
【问题描述】:

当使用 int 类型的参数和值 0 调用存储过程时,Entity Framework 将空值发送到服务器。

var requiredIntParameter = new SqlParameter("RequiredInt", 0);
var tableParameter = new SqlParameter("@Table", System.Data.SqlDbType.Structured);
... table creation ....
List<ReturnType> result = DBContext.Database.SqlQuery<ReturnType>("EXEC NAMEOFSPROC "
           + "@RequiredInt, "
           + "@Table, "
           requiredIntParameter ,
           tableParameter,
           );

实体框架日志:

Opened connection at 1/10/2018 4:42:09 PM +01:00
EXEC NAMEOFSPROC @RequiredInt, @Table
-- RequiredInt: 'null' (Type = Int64, IsNullable = false)
-- @Table: '' (Type = Object, IsNullable = false)
-- Executing at 1/10/2018 4:42:09 PM +01:00
-- Completed in 40 ms with result: SqlDataReader

产生的异常:

参数化查询 '(@RequiredInt int' 需要参数 @RequiredInt'),但未提供。

注意:由于 Sproc 有一个表参数,

((IObjectContextAdapter)this).ObjectContext.ExecuteFunction

不适合我!

使用:

  • EF 6.2.0
  • SQL Server 2008

【问题讨论】:

  • 在RequiredInt 参数之前好像缺少@。
  • 该错误并不意味着传递了一个空值,它意味着调用批处理完全省略了该参数。请附上完整的复制品。 stackoverflow.com/help/mcve
  • 我认为日志中已经很清楚发送到服务器的内容了
  • 省略此参数:var requiredIntParameter = new SqlParameter("RequiredInt", typeof(int));
  • 这个参数在sprocc调用中导致null:var requiredIntParameter = new SqlParameter("RequiredInt", 0);

标签: entity-framework entity-framework-6


【解决方案1】:

有一个解决方法:

var requiredIntParameter = new SqlParameter("RequiredInt", typeof(int)); 
requiredIntParameter.Value = 0;

现在日志是

EXECSPROC @RequiredInt, @Table
-- RequiredInt: '0' (Type = Int32, IsNullable = false)
-- @Table: '' (Type = Object, IsNullable = false)
-- Executing at 1/10/2018 4:42:09 PM +01:00

-- 在 40 毫秒内完成,结果为:SqlDataReader

一切都很好!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多