Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.23;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
15-1187947154
sample01
2007-08-24 13:19
2007.09.23
Explorer


11-1171855380
ebz
2007-02-19 06:23
2007.09.23
Unicode Control


15-1188286117
Галинка
2007-08-28 11:28
2007.09.23
Файловый менеджер для SUSE Linux 10.1


2-1188365803
Алик
2007-08-29 09:36
2007.09.23
Как сделать окно главным относительно других?


10-1132784192
Nortsov
2005-11-24 01:16
2007.09.23
запись вариантного массива в файл