我正在尝试从存储过程返回标量值。我实际上想要返回一个新创建的记录的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);
}
答案 0 :(得分:6)
执行ObjectContext.ExecuteFunction
时,结果为:
来自MSDN的:丢弃从该函数返回的任何结果;并返回受执行影响的行数
即。它不返回输出参数,因为它不知道有一个。此外,正如您在存储过程中调用SET NOCOUNT ON;
一样,它不会返回受影响的行数,因此您得到-1。
因此,您必须进行两项更改:
RETURN @return
执行SELECT @resturn AS alias
。请注意,您需要“AS别名”部分。 alias
可以是您想要的任何列名称。int32
值。如果您有疑问,see this link。通过这种方式,您将读取返回值作为结果集,而不是返回值。
答案 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.
2.
3.
完成所有这些操作后,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提供了另一个输出参数。