Как я могу получить значение @rErr / Output Parameter в c #? - PullRequest
0 голосов
/ 14 февраля 2019

Я создаю хранимую процедуру SQL

create proc p1
(
@name1 nvarchar(50),
@rErr int OUTPUT
)
as
begin Transaction
    insert into test (name1)
    values (@name1)
    if  @name1 = 'n100'
        Begin
            Rollback Transaction
            Set @rErr=50001
            Return @rErr
        End
commit Transaction

Как получить значение @rErr в C #?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Вам не нужна транзакция для одной вставки, вы можете реорганизовать свой SP следующим образом.Чтобы вернуть код в качестве выходного параметра, вы можете просто использовать RETURN(50001)

CREATE PROC P1 (@name1 NVARCHAR(50), 
                @rErr  INT output) 
AS 
    IF @name1 <> 'n100' 
      BEGIN 
          INSERT INTO test(name1) 
          VALUES      (@name1) 

          RETURN(0) 
      END 

    RETURN(50001) 
0 голосов
/ 14 февраля 2019

Доступ к выходным параметрам немного неудобен;вам нужно добавить их в коллекцию параметров обычным способом, с .Direction из Output.Затем вы можете прочитать .Value объекта параметра после выполнения метода.Однако: гораздо проще использовать select и обработать его в результате.Обратите внимание, что значения return могут быть получены аналогичным образом, но с соответствующими значениями .Direction.Тот факт, что вы оба output и return, в этом случае делает его еще более увлекательным ... Я бы просто использовал часть output лично.Или ... выбросить исключение (raiserrror).

Что-то вроде:

using (var cmd = conn.CreateCommand())
{
    cmd.CommandText = "p1";
    cmd.CommandType = CommandType.StoredProcedure;

    var name = cmd.CreateParameter();
    name.ParameterName = "@name1";
    name.Value = "abc"; // etc
    cmd.Parameters.Add(name);

    var err = cmd.CreateParameter();
    err.ParameterName = "@rErr";
    err.Direction = ParameterDirection.Output;
    cmd.Parameters.Add(err);

    cmd.ExecuteNonQuery();
    if (err.Value is int i)
    {
        // error i happened
    }
}

Однако: если вы только что использовали:

raiserror (50001, 16, 1) -- severity needs to be at least 16 here; typically = 16

или(в более поздних версиях SQL Server):

throw 50001, 'oops', 1

гораздо проще получить аналогичный результат;это приведет к направлению Exception от слоя ADO.NET.

(обратите внимание, что вы должны добавить формальное сообщение об ошибке формально к sysmessages, когда использование raiserror - throw не требуетэтот шаг)

Если вы использовали подход throw (или raiserror) и удалили параметр output, весь этот фрагмент кода мог бы стать, с некоторой помощью из Dapper :

conn.Execute("p1", new { name1 = "abc" }, commandType: CommandType.StoredProcedure);

, что на лот легче понять!

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