Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1187935370
Сергей Ю
2007-08-24 10:02
2007.09.23
Как выполнить много асинхронных запросов к БД (ADO)?


2-1188116137
Daedr
2007-08-26 12:15
2007.09.23
Чтение из файла


15-1187882160
Joan
2007-08-23 19:16
2007.09.23
SQL


2-1188178818
wesel
2007-08-27 05:40
2007.09.23
Проблема с Потоками


2-1188393427
gentos
2007-08-29 17:17
2007.09.23
ActiveCell.FormulaR1C1 = "=SUM(R[-CInt(num)]C:R[-1]C)"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский