В настоящее время я использую dapper в одном из наших проектов, и мы все время выполняем хранимые процедуры. В первых нескольких методах все работало нормально, когда выполняемая хранимая процедура возвращает строки.

Прямо сейчас я сталкиваюсь с проблемой, когда пытаюсь получить данные из хранимой процедуры, которая при обнаружении возвращает информацию. Это очень распространенный вариант использования (например, регистрация пользователей в приложении). При вызове метода Query, когда sproc не возвращает ни одной строки, dapper выдает ArgumentException с сообщением:

«При использовании API с несколькими отображениями убедитесь, что вы установили параметр splitOn, если у вас есть ключи, отличные от Id Parameter name: splitOn»

Я использую следующий код:

using (var conn = new SqlConnection(connString))
{
    conn.Open();

    return conn.Query<Customer>(
            sql: "prc_GetCustomer",
            param: new { Parameter = p },
            commandType: CommandType.StoredProcedure).FirstOrDefault();
}

Я знаю, что существует метод Execute, который следует использовать, когда ожидается, что процедура не вернет ни одной строки, но на самом деле это не моя ситуация. Кроме того, исключение dapper вводит в заблуждение, поскольку я не использую множественное отображение.

Любые идеи? Благодарность!

5
rocco 18 Янв 2013 в 23:24
Хранимая процедура возвращает набор данных с нулевыми строками или просто не возвращает набор данных?
 – 
RBarryYoung
19 Янв 2013 в 01:56
Я мог бы повторить проблему, когда хранимая процедура вообще ничего не возвращает. Он отлично работает, если просто возвращает пустой набор результатов в той же структуре, что и объект . Есть ли причина, по которой вы не можете вернуть пустой набор данных вместо ничего?
 – 
ElvisLives
19 Янв 2013 в 01:59
Сейчас эта процедура ничего не возвращает, я согласен, что это не лучшее решение, но у нас есть много устаревших хранимых процедур, подобных этой. Мне просто интересно, не мог ли dapper проверить, нет ли полей, и просто вернуть значение по умолчанию (T)
 – 
rocco
19 Янв 2013 в 02:12
Да, на первый взгляд, я не понимаю, как это сделать. Даже если вы просто используете метод Query вместо Query , он генерирует то же исключение ArgumentException.
 – 
ElvisLives
19 Янв 2013 в 02:23
Можете уточнить: возвращает ли нулевые сетки? Или он возвращает какую-то пустую сетку?
 – 
Marc Gravell
19 Янв 2013 в 13:25

1 ответ

Лучший ответ

Если запрос не возвращает сетки результатов, следует использовать Execute, а не Query.

5
Marc Gravell 19 Янв 2013 в 13:21
Я думаю, что эти хранимые процедуры используют неправильную логику, когда проверяют что-то перед тем, как вернуть сетку (или пустую). Это семантическая вещь, поддерживаемая обычным DbDataReader, так что дело дошло до этого. IMHO Dapper должен поддерживать такую ​​ситуацию, но я приму ответ.
 – 
rocco
21 Янв 2013 в 15:31
Итак, если я прочитал это правильно, PROC-A -> иногда возвращает 0 записей; Я получаю эту ошибку, когда возвращает 0 записей; Итак, чтобы исправить это, мне нужно сделать дополнительный вызов для подсчета, чтобы убедиться, что я не вызываю этот процесс, когда он находится в состоянии, которое не возвращает записи?
 – 
P. Roe
29 Июл 2014 в 22:13
Нет, не связано. Возврат нулевых строк из выборки сильно отличается от того, чтобы не делать выбор вообще. Если не выполняется выбор: Выполнить.
 – 
Marc Gravell
29 Июл 2014 в 22:15