从Entity Framework中的存储过程获取结果反馈

rem*_*rem 3 sql-server stored-procedures entity-framework sql-server-2008 entity-framework-4

在SQL Server 2008中,我有一个简单的存储过程将一堆记录移动到另一个表:

CREATE PROCEDURE [dbo].MyProc(@ParamRecDateTime [datetime])
AS
BEGIN
SET NOCOUNT ON;

INSERT INTO [dbo].Table2 
SELECT 
...,
    ...
FROM [dbo].Table1 
      WHERE RecDateTime <= @ParamRecDateTime    

DELETE FROM [dbo].Table1 
      WHERE RecDateTime <= @ParamRecDateTime        
END
Run Code Online (Sandbox Code Playgroud)

从SQL Server Management Studio中运行它,我完成了工作并返回值= 0

 DECLARE @return_value int
 EXEC    @return_value = dbo.MyProc @ParamRecDateTime = '2011-06-25 11:00:00.000'
 SELECT  'Return Value' = @return_value
Run Code Online (Sandbox Code Playgroud)

但是当我使用Entity框架从应用程序调用相同的存储过程时,我也完成了工作,但返回值为"-1":

int result = myrepository.MyProc(datetimePar);
MessageBox.Show(result.ToString());
Run Code Online (Sandbox Code Playgroud)

我没有设法找到这个错误的解释,但发现这个令人沮丧的帖子,据说SQL Server中没有这种类型的返回码的标准.

从Entity Framework调用存储过程执行结果以及存储过程何时不返回任何实体时,了解存储过程执行结果的好方法是什么?

Jef*_*ata 5

一种方法是打电话ExecuteStoreCommand,并通过SqlParameter以下方向传递Output:

var dtparm = new SqlParameter("@dtparm", DateTime.Now);
var retval = new SqlParameter("@retval", SqlDbType.Int);

retval.Direction = ParameterDirection.Output;

context.ExecuteStoreCommand("exec @retval = MyProc @dtparm", retval, dtparm);

int return_value = (int)retval.Value;
Run Code Online (Sandbox Code Playgroud)

本来我尝试使用的方向ReturnValue:

retval.Direction = ParameterDirection.ReturnValue;

context.ExecuteStoreCommand("MyProc @dtparm", retval, dtparm);
Run Code Online (Sandbox Code Playgroud)

retval.Value永远都是0.我意识到这retval是执行MyProc @dtparm语句的结果,所以我将其更改为捕获返回值MyProc并将其作为输出参数返回.