Работа с Output параметрами в Dapper и C#: примеры и решения
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для работы с выходными параметрами хранимых процедур с использованием Dapper следует создать экземпляр класса DynamicParameters
, указать параметры: имена, типы, установить направление как Output
, выполнить процедуру и получить значение выходного параметра.
var parameters = new DynamicParameters();
parameters.Add("@OutputParam", dbType: DbType.Int32, direction: ParameterDirection.Output);
connection.Execute("sp_NoMorePrefixes_MyProcedure", parameters, commandType: CommandType.StoredProcedure);
int result = parameters.Get<int>("@OutputParam");
Параметры инициализируются с помощью метода parameters.Add()
, где установлен direction: ParameterDirection.Output
. Для извлечения выходных значений применяйте parameters.Get<T>()
после выполнения процедуры.
Разъяснение нюансов
Работа с параметрами через Dapper
DynamicParameters
позволяет динамично управлять входными и выходными параметрами. Метод Add
предоставляет возможность указать параметры и их атрибуты, ведущий себя подобно фокусному волшебству. DynamicParameters.Add()
– это ваш инструмент для операций с параметрами.
Принципы именования
Стремитесь избежать стандартизированных имен и префиксов, таких как "SP_", чтобы устранить возможные конфликты и путаницу. Выбирайте уникальные и ясные наименования для стабильной работы системы.
Основы выполнения
При использовании Dapper для запуска хранимых процедур укажите CommandType.StoredProcedure
, подобно выбору режима приготовления на кофемашине.
Об использовании Reflection
Reflection может снижать производительность из-за динамического добавления параметров. Чтобы этого избежать, используйте DynamicParameters.AddDynamicParams()
для добавления анонимных объектов.
Получение результата
После выполнения процедуры значение выходного параметра доступно для считывания, подобно десерту, готовому к употреблению после основного блюда.
Создание настраиваемых методов расширения
При регулярном использовании выходных параметров их использование можно упростить введением настраиваемых методов расширений, адаптированных по вашей задаче, как одежда, сшитая на заказ.
Визуализация
// Подготовка объекта для параметров
var dynamicParams = new DynamicParameters();
// Заполнение параметров
dynamicParams.Add("CookieType", "ChocolateChip", DbType.String, ParameterDirection.Input);
// Добавляем выходной параметр
dynamicParams.Add("BatchSizeOutput", dbType: DbType.Int32, direction: ParameterDirection.Output);
// Запуск процедуры по выпечке печенья
// Примечание: фурна горяча!
connection.Execute("sp_BakeCookies", dynamicParams, commandType: CommandType.StoredProcedure);
// Проверяем результат
int batchSize = dynamicParams.Get<int>("BatchSizeOutput");
Представляйте DynamicParameters
в качестве рецепта:
До: [🍪📝] Вход: "ChocolateChip" ➡️ ВЫход: количество печенек неизвестно
После: [🍪📝] ВЫход: вкусная партия из 12 печенек 🍪
Яркое указание DbType
Указание DbType
помогает корректно определить типы данных. В случае целых чисел используйте:
parameters.Add("@OutputParam", dbType: DbType.Int32, direction: ParameterDirection.Output);
Оптимизация вызовов
Проектируйте вызовы методов так, чтобы они были оптимальными при работе с выходными параметрами, организуйте код в виде аккуратно уложенного набора инструментов.
Использование анонимных объектов
Анонимные объекты облегчают добавление параметров быстро и без использования reflection, наподобие быстрой мышки, пробегающей сквозь лабиринт:
dynamicParams.AddDynamicParams(new { InputValue = 123 });
Путь профессионала: сложные ситуации
Работа с множественными выходными параметрами
Если процедура возвращает сразу несколько выходных параметров, используйте DynamicParameters
для их управления.
var p = new DynamicParameters();
p.Add("@FirstOutput", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@SecondOutput", dbType: DbType.Decimal, direction: ParameterDirection.Output);
Анализ результатов по окончании выполнения
Информация, полученная по окончании, может предоставить ценные данные о процессе и выявить нестандартное поведение.
int id = p.Get<int>("@FirstOutput");
decimal price = p.Get<decimal>("@SecondOutput");
Обработка null значений
Адекватная работа с null
значениями в выходных параметрах потребует использования nullable типов или проведения предварительной проверки.
int? possibleNullResult = p.Get<int?>("@NullableOutput");
Использование транзакций
Для выполнения процедуры в рамках транзакции передайте объект транзакции в вызов Execute
.
using (var transaction = connection.BeginTransaction())
{
connection.Execute("sp_YourProcedure", p, transaction, commandType: CommandType.StoredProcedure);
}