Форум: "Начинающим";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];
ВнизSelect ... where (Field1 in (:array1)) для MS Access Найти похожие ветки
← →
Alex7 © (2007-08-30 06:59) [0]Здравствуйте, уважаемые мастера.
Пытаюсь в строке текста запроса задать динамически изменяемый параметр типа ftArray (по факту Array of Integer). Поле Field1 ->Integer.
Select ... where (Field1 in (:array1))
При попытке задать параметру тип ftArray,
пишет ошибку: "Аргументы имеют неверный тип, выходят за рамки допустимого диапазона или вступают в конфликт друг с другом"
Где ошибка?
Спасибо.
MS Access 2003, ADODataSet
← →
sniknik © (2007-08-30 08:18) [1]ftArray вообщето не поддерживается, а даже если бы поддерживался условие у тебя в запросе было бы неверное т.к. in это для перечислений или проверок в рекордсетах от подзапросов, а не в переменных типа массив (которых нет).
← →
Alex7 © (2007-08-30 09:41) [2]>sniknik
Понял, спасибо.
Попробую так:
where (Field1 in (:p1, :p2, :p3, ..., :pn))
← →
Sergey13 © (2007-08-30 09:58) [3]> [2] Alex7 © (30.08.07 09:41)
А не проще в данном случае сформировать запрос динамически и без переменных?where (Field1 in (+сформированная строка с перечнем значений+))
Ведь как я понял число параметров будет разным всегда, и разбор запроса все равно будет происходить. Впрочем, я шибко сомневаюсь, что у аксеса есть кэш запросов вообще.
← →
DrPass © (2007-08-30 10:12) [4]
> А не проще в данном случае сформировать запрос динамически
> и без переменных?
В общем случае - не проще. Т.к. это дурной тон, хотя бы потому, что делает программу уязвимой к SQL injection. Там, где можно использовать параметры, следует использовать параметры
← →
Sergey13 © (2007-08-30 10:16) [5]> [4] DrPass © (30.08.07 10:12)
Я и присал про "данный случай", а не "общий". В данном случае использование переменных сродни пристегиванию ремнем безопасности при езде на велосипеде. ИМХО.
← →
Jeer © (2007-08-30 10:25) [6]
> DrPass © (30.08.07 10:12) [4]
Если число перечислений меняется от запроса к запросу- а это обычное дело, то нет особого смысла в использовании параметров.
Более того, например, MS SQL поддерживает автоматическую параметризацию и выборку подходящего плана, что может быть эффективнее, чем принудительная параметризация.
← →
Anatoly Podgoretsky © (2007-08-30 10:56) [7]Смысл параметров появится, если это не числа и против инжекции.
Если числа, то в данном конкретном случае не надо.
Так же смысл может быть, если запрос надо выполнять в цикле, меняя только значения параметров, без смены количества.
Ну и надо подумать от отказе от IN
← →
Alex7 © (2007-08-30 11:23) [8]Спасибо, за столь подробный разбор вопроса.
К оператору IN пришел после неудачных попыток применения следующей конструкции:
SELECT ... WHERE (...)
AND (...)
AND ((Field1 =:P1) OR (Field1 =:P2) OR (Field1=:P3), ..., OR (Field1=:Pn))
в этой конструкции поле Field1 было типа string
(Пользователь задает значения этих параметров выбирая несколько позиций из листбокса.)
Почему- то при n>5 ACCESS возбуждает ошибку:"Ошибка при выполнении многошаговой операции...". Так и не разобрался с чем связана эта ошибка: то ли длина куска строки запроса, заключенная в общие скобки велика, то ли количество сравнений в рамках одного AND велико и есть какие-то ограничения,то ли еще что - не знаю, но, наверно, это уже другая ветка.
Спасибо.
← →
Sergey13 © (2007-08-30 11:38) [9]> [8] Alex7 © (30.08.07 11:23)
Есть еще вариант - вставлять выбранные значения в а-ля временную таблицу и соединять с ней в запросе. Но надо думать про аутентификацию записей в ней при многопользовательской работе и не забывать чистить за собой.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.044 c