存储过程返回错误的标量值-1,而不是返回值

时间:2014-06-16 23:08:29

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

我正在尝试从存储过程返回标量值。我实际上想要返回一个新创建的记录的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);  
}  

4 个答案:

答案 0 :(得分:6)

执行ObjectContext.ExecuteFunction时,结果为:

  来自MSDN的

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

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

因此,您必须进行两项更改:

  1. 更改您的程序,使其不返回值,但选择它,即代替RETURN @return执行SELECT @resturn AS alias。请注意,您需要“AS别名”部分。 alias可以是您想要的任何列名称。
  2. 更改存储过程的映射,以便它需要int32值。如果您有疑问,see this link
  3. 通过这种方式,您将读取返回值作为结果集,而不是返回值。

答案 1 :(得分:4)

解决这个实体框架问题并假设你已经有一个存储过程正在工作,而你不想使用其他方法来修复它工作良好的地方,那么EF可以替换:

RETURN(0)

使用:

BEGIN
    SELECT(0)
    RETURN(0)
END

即如果它是IF句子的一部分,
מ转到: EF模型(.edmx) - &gt;模型浏览器 - &gt;功能导入 - &gt; (双击你的功能) - &gt;标量 - &gt; Int32

现在您的返回值是:

ObjectResult<Nullable<int>>

您可以通过以下方式收到:

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

或在图片中:
1.
Model Browser
2.
Function Imports
3.
Scalars

完成所有这些操作后,EF模型(.edmx)也支持“从数据库更新模型...”,您可以更新它而无需担心您刚才所做的更改。

答案 2 :(得分:0)

感谢DavidG的文章。它让我开始走正确的道路。所以我做的就是改变我的存储过程来返回一个ObjectResult而不是一个int。然后我对Stored Procedure调用的结果做了一个SingleOrDefault(),它产生了我的int返回值。像这样:

存储过程:
     - 返回@return不起作用。无法返回标量值
    SELECT @return - 返回包含int的单个对象的结果集。

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

我读了这样的结果:
    var id = myDbContext.My_Return_Int(123).SingleOrDefault();

答案 3 :(得分:0)

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