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

msc*_*chu 5 stored-procedures entity-framework entity-framework-6

我试图从存储过程返回标量值.我实际上想要返回一个新创建的记录的ID,但我已经将我的问题简化为一个存储过程,该存储过程需要int并尝试返回相同的内容int.这总是返回-1.非常感谢您的帮助.

Web API控制器调用

var idtest = dbconn.my_return_int(123);
Run Code Online (Sandbox Code Playgroud)

存储过程:

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

    SET @return = -999

RETURN @return
END   
Run Code Online (Sandbox Code Playgroud)

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);  
}  
Run Code Online (Sandbox Code Playgroud)

Yak*_*nor 6

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

RETURN(0)
Run Code Online (Sandbox Code Playgroud)

和:

BEGIN
    SELECT(0)
    RETURN(0)
END
Run Code Online (Sandbox Code Playgroud)

也就是说,如果它是 IF 语句的一部分,
则?转到:EF模型(.edmx)->模型浏览器->函数导入->(双击您的函数)->标量-> Int32

现在你的返回值是:

ObjectResult<Nullable<int>>
Run Code Online (Sandbox Code Playgroud)

你可以通过写信来接收它:

int? response = 0;
response = myEntity.myStoredProcedure(var1, var2).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

或在图片中:
1。
模型浏览器
2.
函数导入
3.
标量

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


Jot*_*aBe 6

执行ObjectContext.ExecuteFunction结果时:

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

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

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

  1. 改变你的过程,以便它不返回值,但选择它,IE的替代RETURN @returnSELECT @return AS alias.请注意,您需要"AS别名"部分.在alias可以任何你想要的列名.
  2. 更改存储过程的映射,以便它期望一个int32值.如果您有疑问,请参阅此链接.

这样,您将读取返回值作为结果集,而不是返回值.


msc*_*chu 1

谢谢 DavidG 的文章。它让我开始走上正确的道路。因此,我为解决此问题所做的是将我的存储过程更改为返回一个ObjectResult<int?>而不是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.
Run Code Online (Sandbox Code Playgroud)

然后,我生成的代码看起来像上面,但不是返回一个,而是int返回一个ObjectResult<int?>

我读到的结果是这样的:

var id = myDbContext.My_Return_Int(123).SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)