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调用存储过程执行结果以及存储过程何时不返回任何实体时,了解存储过程执行结果的好方法是什么?
一种方法是打电话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并将其作为输出参数返回.