Доступ к выходным параметрам немного неудобен;вам нужно добавить их в коллекцию параметров обычным способом, с .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);
, что на лот легче понять!