【问题标题】:Stored Procedure returns incorrect scalar value of -1, instead of return value存储过程返回错误的标量值 -1,而不是返回值
【发布时间】:2014-08-06 20:36:10
【问题描述】:

我正在尝试从存储过程返回一个标量值。我实际上想返回一个新创建的记录的 ID,但我已将问题简化为一个存储过程,它采用 int 并尝试返回相同的 int。这总是返回-1。非常感谢您的帮助。

Web API 控制器调用

var idtest = dbconn.my_return_int(123);

存储过程:

ALTER PROCEDURE [dbo].[my_return_int]  
    @ID int  
AS  
BEGIN  
    SET NOCOUNT ON;  
    DECLARE @return as int

    SET @return = -999

RETURN @return
END   

Context 生成的存储过程调用

public virtual int my_return_int(Nullable<int> iD)  
{  
    var iDParameter = iD.HasValue ?
        new ObjectParameter("ID", iD) :
        new ObjectParameter("ID", typeof(int));

    return (IObjectContextAdapter)this).ObjectContext.ExecuteFunction("my_return_int", iDParameter);  
}  

【问题讨论】:

标签: entity-framework stored-procedures entity-framework-6


【解决方案1】:

当你执行ObjectContext.ExecuteFunction时,结果是:

from MSDN:丢弃函数返回的任何结果;并返回受执行影响的行数

即它不返回输出参数,因为它不知道有一个。此外,由于您在存储过程中调用了SET NOCOUNT ON;,它甚至不返回受影响的行数,因此您得到-1。

所以,你必须做两处改变:

  1. 更改您的过程,使其不返回值,而是选择它,即用SELECT @return AS alias 代替RETURN @return。请注意,您需要“AS 别名”部分。 alias 可以是您想要的任何列名称。
  2. 更改存储过程的映射,使其需要int32 值。如有疑问,请参阅此Q&A

通过这种方式,您将读取返回值作为结果集,而不是返回值。

【讨论】:

  • 包含的指向 www.devtoolshed.com 的链接正在转发到看似随机的站点。
【解决方案2】:

要解决此实体框架问题,并假设您已经有一个存储过程正在运行,并且您不想使用其他方式修复它运行良好的地方,那么您可以替换 EF:

RETURN(0)

与:

BEGIN
    SELECT(0)
    RETURN(0)
END

如果它是 IF 句的一部分,
前往: EF模型(.edmx)->模型浏览器->函数导入->(双击你的函数)->标量-> Int32

现在你的返回值是:

ObjectResult<Nullable<int>>

你可以写信收到:

int? response = 0;
response = myEntity.myStoredProcedure(var1, var2).FirstOrDefault();

或在图片中:
1.

2.

3.

这样做会使 EF 模型 (.edmx) 也支持“从数据库更新模型...”,您可以更新它而不必担心刚刚所做的更改。

【讨论】:

  • 各种各样的。这是唯一正确的答案。
【解决方案3】:

感谢 DavidG 的文章。它让我开始走上正确的道路。所以我为解决这个问题所做的就是更改我的存储过程以返回ObjectResult&lt;int?&gt; 而不是int。然后我对存储过程调用的结果进行了SingleOrDefault(),这产生了我的int 返回值。像这样:

存储过程:

-- RETURN @return does not work. Can't return a scalar value  
SELECT @return  -- This returns a result set with a single object that contains an int.

然后,我生成的代码如上所示,但不是返回int,而是返回ObjectResult&lt;int?&gt;

我读到这样的结果:

var id = myDbContext.My_Return_Int(123).SingleOrDefault();

【讨论】:

    【解决方案4】:

    我刚刚在我的项目中实现了另一个选项。我为@return 输入另一个输出参数。

    【讨论】:

      猜你喜欢
      • 2014-05-15
      • 2017-03-16
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 2017-07-12
      相关资源
      最近更新 更多