#db2 #dapper
#db2 #dapper
Вопрос:
У меня проблема с запросом выбора с использованием: DB2, Dapper, В предложении. Я пытаюсь передать массив строк в запрос. Сам запрос работает нормально, но запрос выбирает ТОЛЬКО первое значение из массива, т.Е. (код sudo, поскольку я буду использовать это в коде C #)
Select col1, col1, col3 from schema.tblName
Where col1 = ? AND col2 IN (?)
Теперь, немного подробнее о настройке, есть разница между запросами с использованием Dapper в MSSQL и DB2.
Мой DB2 настроен только на параметры, основанные на позиции, так что? вместо параметров (я не могу это контролировать) и я не могу использовать именованные параметры.
В C # я пробовал что-то вроде этого:
var parameters = new {"1", new[]{"1000","2000"}};
var results = conn.Query<dynamic>(aboveSql, paramers);
Все это работает нормально, компилируется и выполняется нормально. Но запрос НЕ вернет значения для второго значения String Array (это предложение IN инструкции Select).
Он вернет результаты только для первого значения String array.
Я провел несколько обширных исследований, пытался применить различные методы, а также следовал ссылке ниже https://huorswords.github.io/dapper/parameters/sql/in/2019/07/16/dapper-avoid-parentheses-IN-clause.html (имейте в виду, что приведенная выше ссылка предназначена для MSSQL, а НЕ ДЛЯ DB2).
Попытался изменить запрос, удалить скобки не удалось.
Попытался изменить тип параметра со String[]{} на List или IEnumerable — по-прежнему безрезультатно. Я проверил документацию Dapper — все, что они говорят В предложении, поддерживается.
У кого-нибудь есть идея, как использовать предложение IN с параметром Array в DB2, и может предложить решение, я был бы очень признателен.
Спасибо
Комментарии:
1. Для приложений командной строки Db2 каждый элемент списка IN должен иметь свой собственный маркер параметра в запросе, когда Db2 компилирует запрос . Поскольку ваш запрос имеет один маркер параметра, привязывается только первая запись массива.
2. Привет @mao, сначала спасибо, что нашли время прочитать и ответить на сообщение, очень признателен. Поскольку значения в предложении IN являются динамическими, мне придется динамически устанавливать параметры позиционирования, вопросительные знаки. Я протестирую это в понедельник и обновлю. Это действительно имеет смысл, поскольку код не прерывается и не содержит ошибок. Просто возвращает результат ТОЛЬКО для первого значения в предложении IN .
3. @mao, просто для подтверждения. Ваше объяснение, безусловно, является причиной того, что код компилируется, но принимает ТОЛЬКО первый параметр из string array. Я жестко запрограммирован… В (?,?) — сопоставление количества значений в строковом массиве и получение правильного результата. К сожалению, это означало бы, что я должен найти способ динамического изменения запроса для включения переменного числа ? в предложении IN .
Ответ №1:
Согласно этой странице, вы можете использовать псевдопозиционные параметры.
Это будет выглядеть примерно так:
string sql = "SELECT col1, col1, col3 from schema.tblName WHERE col1 = ?param1? AND col2 IN ?param2?";
var results = conn.Query<dynamic>(sql, new {param1 = "1", param2 = new[]{"1000","2000"}});
Параметр ?param1? будет заменен на ? и param1
элемент будет вставлен в качестве позиционного параметра, аналогично param2.
РЕДАКТИРОВАТЬ: удалены круглые скобки вокруг выражения IN . Они должны быть вставлены Dapper.
Комментарии:
1. Привет @Palle Due, спасибо за предложение и ссылку. Я протестировал возможное исправление. Я получаю ошибки при изменении моего запроса на предложенный: найден неожиданный токен. Ожидаемые токены могут включать: В МИКРОСЕКУНДАХ МИКРОСЕКУНДНЫЕ СЕКУНДЫ СЕКУНДЫ МИНУТЫ МИНУТЫ ЧАСЫ. SQLSTATE: 42601, SQLCODE: -104 (когда я последую вашему предложению — скобки вокруг? param2?) И количество переменных хоста в инструкции EXECUTE или OPEN не равно количеству требуемых значений. SQLSTATE: 07001, SQLCODE: -313 (когда я следую предложению из ссылки — нет скобок вокруг? param2?)
2. @Kriss2: Извините за это. Вокруг списка IN определенно не должно быть круглых скобок. Я отредактировал ответ.
3. не беспокойтесь об этом. Ваш ответ был на самом деле точен. Предоставленная вами ссылка указала мне на этот сайт: dapper.programmingpedia.net/en/tutorial/10/… В конце концов, мой запрос должен был выглядеть следующим образом: string sql = «ВЫБЕРИТЕ col1, col1, col3 из schema.tblName ГДЕ col1 = ? И col2 В ?param2?»; Я пытался поддержать ваш пост, но мне не разрешено : (