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

时间:2011-11-05 14:22:15

标签: sql-server sql-server-2008 entity-framework stored-procedures 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

在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

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

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

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

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

4 个答案:

答案 0 :(得分:5)

执行此操作的一种方法是致电ExecuteStoreCommand,然后传递方向为SqlParameter的{​​{1}}:

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的返回值并将其作为输出参数返回。

答案 1 :(得分: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);
}

答案 2 :(得分:0)

请参阅存储过程的SQL参数的OUTPUT属性, here

答案 3 :(得分:0)

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

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 @InParamName=@0, @OutParamName1=@1 output, @OutParamName2=@2 output", parameters);

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

请注意使用的类型(十进制。)如果需要其他类型,请记住不仅要在方法参数列表中更改它,还要更改SqlDbType.XXX