3

在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 

运行它从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 

但是,当我使用实体框架调用从一个应用程序相同的存储过程,我也把工作做好,但返回的值是“-1”:

int result = myrepository.MyProc(datetimePar); 
MessageBox.Show(result.ToString()); 

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

当从实体框架调用存储过程执行结果时,以及存储过程没有返回任何实体时,获得存储过程执行结果的知道的好方法是什么?

+2

如果删除'SET NOCOUNT ON',该怎么办? –

+0

@Wouter de Kort:有趣!在这种情况下,作为返回值,我会完成一些操作,即移动的记录数乘以2.这是应该发生的事情吗? – rem

+0

是的,它返回受影响的记录数。在这种情况下,你插入和删除相同数量的记录,因此乘以2. –

回答

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; 

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

retval.Direction = ParameterDirection.ReturnValue; 

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

retval.Value将始终为0。我意识到retval是执行MyProc @dtparm语句的结果,因此我将其更改为捕获返回值MyProc并将其作为输出参数返回。

+0

谢谢,+1。它可以作为另一种方法。在我的情况下,当使用'retval.Direction = ParameterDirection.Output;'时,它返回0,并且在使用'retval.Direction = ParameterDirection.ReturnValue;'(我的EF函数导入时给出错误“必须声明标量变量”@retval“在“返回集合”中声明为“无”)。 – rem

0

参见存储过程的SQL PARAM输出属性, here

0

以供将来参考:我有同样的问题,但需要多个输出变量。解决方案是两种答案的组合。以下是一个完整的示例。

public void MyStoredProc(int inputValue, out decimal outputValue1, out decimal outputValue2) 
{ 
    var parameters = new[] { 
     new SqlParameter("@0", inputValue), 
     new SqlParameter("@1", SqlDbType.Decimal) { Direction = ParameterDirection.Output }, 
     new SqlParameter("@2", SqlDbType.Decimal) { Direction = ParameterDirection.Output } 
    }; 

    context.ExecuteStoreCommand("exec MyStoredProc @[email protected], @[email protected] output, @[email protected] output", parameters); 

    outputValue1 = (decimal)parameters[1].Value; 
    outputValue2 = (decimal)parameters[2].Value; 
} 

请注意使用的类型(十进制)。如果需要另一种类型,记得不仅改变它在方法参数列表也是SqlDbType.XXX

2
using (dbContext db = new dbContext()) 
{ 
var parameters = new[] 
{ 
new SqlParameter("@1","Input Para value"), 
new SqlParameter("@2",SqlDbType.VarChar,4){ Value = "default if you want"}, 
new SqlParameter("@3",SqlDbType.Int){Value = 0}, 
new SqlParameter("@4","Input Para Value"), 
new SqlParameter("@5",SqlDbType.VarChar,10) { Direction = ParameterDirection.Output }, 
new SqlParameter("@6",SqlDbType.VarChar,1000) { Direction = ParameterDirection.Output } 
}; 
db.ExecuteStoreCommand("EXEC SP_Name @1,@2,@3,@4,@5 OUT,@6 OUT", parameters); 
ArrayList ObjList = new ArrayList(); 
ObjList.Add(parameters[1].Value); 
ObjList.Add(parameters[2].Value); 
}