Получение результата обратной связи от хранимой процедуры в Entity Framework - PullRequest
3 голосов
/ 05 ноября 2011

В 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 Framework, я также выполняю работу, но возвращаемое значение равно "-1":

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

Мне не удалось найти объяснение этой ошибке, но я нашел этот обескураживающий пост, в котором говорится, что в SQL Server не существует стандарта для этого типа кодов возврата.

Каков хороший и надежный способ узнать результат выполнения хранимой процедуры при вызове его из Entity Framework и когда хранимая процедура не возвращает никаких сущностей?

Ответы [ 4 ]

5 голосов
/ 05 ноября 2011

Один из способов сделать это - вызвать 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 и вернуть его в качестве выходного параметра.

2 голосов
/ 14 сентября 2012
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);
}
0 голосов
/ 30 августа 2012

Для дальнейшего использования: у меня была та же проблема, но мне нужно было несколько переменных 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.

0 голосов
/ 20 января 2012

См. Атрибут OUTPUT для SQL-параметра процедуры хранения, здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...