在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调用存储过程执行结果以及存储过程何时不返回任何实体时,了解存储过程执行结果的好方法是什么?
答案 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
。