我试图获取存储过程的返回值。以下是此类存储过程的示例:
select
Name,
IsEnabled
from
dbo.something
where
ID = @ID
if @@rowcount = 0
return 1
return
这是一个简单的选择。如果找到0行,我的结果集将为null,但我仍然会有一个返回值。
这是一个不好的例子,因为这是一个选择,所以我肯定能找到是否返回了0行。但是,在插入,删除或其他调用中,我们需要此返回值来了解是否存在问题。我一直无法找到获得此返回值的方法。我可以得到输出值,我可以得到结果集,但没有返回值。
如果我手动调用SQL,或者即使我使用实体框架运行SqlCommand
,我也可以获得返回值,但这不是我想要做的。
有没有人能够使用Entity Framework从存储过程中获取返回值?
感谢您的帮助!
答案 0 :(得分:6)
我想对存储过程返回值的支持取决于Entity框架的版本。虽然直接返回值对我来说没有用,但我设法使用OUTPUT存储过程参数获取值。例如:
USE [YOUR_DB_NAME]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TestReturnValue]
@InputValue int = 0,
@Result int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @Result = @InputValue
RETURN(@InputValue);
END
这是测试代码:
void TestReturnValue()
{
using (var db = new YourDBContext())
{
var result = new System.Data.Objects.ObjectParameter("Result", 0);
Console.WriteLine("SP returned {0}", db.TestReturnValue(123, result));
Console.WriteLine("Output param {0}", result.Value);
}
}
这是输出:
SP returned -1
Output param 123
正如你看到直接返回的值输出一些垃圾,但OUTPUT参数有效!
This article provides general info on two ways of returning values from SP
希望这有帮助
答案 1 :(得分:3)
我已经能够使用代码优先方法获得Entity Framework 5的返回值(以及输出和输入参数)(但我认为它适用于版本4.x)。从你的帖子我看不到你正在使用的EF版本以及你如何进行映射;如果您考虑在此处使用代码优先方法,您可以使用解决方案找到我的帖子:
答案 2 :(得分:2)
没有。实体框架没有丰富的存储过程支持,因为它是一个ORM,而不是SQL替代。
正如您已经发现的,如果您需要使用不太常见(更高级?)的存储过程功能,则必须使用老式的ADO.NET。
答案 3 :(得分:0)
您必须使用“Context.Database.SqlQuery”,并指定存储过程的输出类型
var spReturnVaue = Context.Database.SqlQuery<Type>("[schema].YourSp").FirstOrDefault();
int firstId = Context.Database.SqlQuery<int>("[dbo].GetFirstId").FirstOrDefault();
答案 4 :(得分:-1)
为了在EF中获得感兴趣的结果,您应该返回相同的结构(不是1和Name,IsEnabled) 在此查询中,您应该在if条件中返回'',0而不是1:
select Name, IsEnabled from dbo.something where ID = @ID if @@rowcount = 0 return '',0