ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Работа с Output параметрами в Dapper и C#: примеры и решения

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для работы с выходными параметрами хранимых процедур с использованием Dapper следует создать экземпляр класса DynamicParameters, указать параметры: имена, типы, установить направление как Output, выполнить процедуру и получить значение выходного параметра.

csharp
Скопировать код
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>() после выполнения процедуры.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Разъяснение нюансов

Работа с параметрами через Dapper

DynamicParameters позволяет динамично управлять входными и выходными параметрами. Метод Add предоставляет возможность указать параметры и их атрибуты, ведущий себя подобно фокусному волшебству. DynamicParameters.Add() – это ваш инструмент для операций с параметрами.

Принципы именования

Стремитесь избежать стандартизированных имен и префиксов, таких как "SP_", чтобы устранить возможные конфликты и путаницу. Выбирайте уникальные и ясные наименования для стабильной работы системы.

Основы выполнения

При использовании Dapper для запуска хранимых процедур укажите CommandType.StoredProcedure, подобно выбору режима приготовления на кофемашине.

Об использовании Reflection

Reflection может снижать производительность из-за динамического добавления параметров. Чтобы этого избежать, используйте DynamicParameters.AddDynamicParams() для добавления анонимных объектов.

Получение результата

После выполнения процедуры значение выходного параметра доступно для считывания, подобно десерту, готовому к употреблению после основного блюда.

Создание настраиваемых методов расширения

При регулярном использовании выходных параметров их использование можно упростить введением настраиваемых методов расширений, адаптированных по вашей задаче, как одежда, сшитая на заказ.

Визуализация

csharp
Скопировать код
// Подготовка объекта для параметров
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 в качестве рецепта:

Markdown
Скопировать код
До: [🍪📝] Вход: "ChocolateChip" ➡️ ВЫход: количество печенек неизвестно
После: [🍪📝] ВЫход: вкусная партия из 12 печенек 🍪

Яркое указание DbType

Указание DbType помогает корректно определить типы данных. В случае целых чисел используйте:

csharp
Скопировать код
parameters.Add("@OutputParam", dbType: DbType.Int32, direction: ParameterDirection.Output);

Оптимизация вызовов

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

Использование анонимных объектов

Анонимные объекты облегчают добавление параметров быстро и без использования reflection, наподобие быстрой мышки, пробегающей сквозь лабиринт:

csharp
Скопировать код
dynamicParams.AddDynamicParams(new { InputValue = 123 });

Путь профессионала: сложные ситуации

Работа с множественными выходными параметрами

Если процедура возвращает сразу несколько выходных параметров, используйте DynamicParameters для их управления.

csharp
Скопировать код
var p = new DynamicParameters();
p.Add("@FirstOutput", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@SecondOutput", dbType: DbType.Decimal, direction: ParameterDirection.Output);

Анализ результатов по окончании выполнения

Информация, полученная по окончании, может предоставить ценные данные о процессе и выявить нестандартное поведение.

csharp
Скопировать код
int id = p.Get<int>("@FirstOutput");
decimal price = p.Get<decimal>("@SecondOutput");

Обработка null значений

Адекватная работа с null значениями в выходных параметрах потребует использования nullable типов или проведения предварительной проверки.

csharp
Скопировать код
int? possibleNullResult = p.Get<int?>("@NullableOutput");

Использование транзакций

Для выполнения процедуры в рамках транзакции передайте объект транзакции в вызов Execute.

csharp
Скопировать код
using (var transaction = connection.BeginTransaction())
{
    connection.Execute("sp_YourProcedure", p, transaction, commandType: CommandType.StoredProcedure);
}

Полезные материалы

  1. Официальный репозиторий Dapper на Github
  2. Репозиторий сообщества Dapper на Github
  3. Статья на C# Corner о хранимых процедурах и Dapper
  4. Статья на CodeProject о хранимых процедурах и выходных параметрах с Dapper