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

Вниз

Подстановка параметров в TQuery   Найти похожие ветки 

 
Быстрый Шу   (2006-06-06 10:11) [0]

Добрый день!
вообщем задача такова:
Query1.SQL.Text:="SELECT * FROM HOUSES WHERE ID_HOUSE = :Id_House";
Query1.ParamByName("HOUSES").AsInteger:=2595;

получается в итоге запрос вида:
SELECT * FROM HOUSES WHERE ID_HOUSE = 2595
это работает....
===
а вот если я хочу получить запрос вида:
SELECT * FROM HOUSES WHERE ID_HOUSE IN (2595, 2596, 2597)
Что мне для этого нужно подставить в параметр :ID_HOUSE?


 
Быстрый Шу   (2006-06-06 10:12) [1]

соответственно, что бы текст квери был примерно таков, как я понимаю:
Query1.SQL.Text:="SELECT * FROM HOUSES WHERE ID_HOUSE IN (:Id_House)";
Query1.ParamByName("HOUSES").As??????:=???????;


 
Быстрый Шу   (2006-06-06 10:14) [2]

упс, обшибся,
здесь
Query1.ParamByName("HOUSES").AsInteger:=2595;
вместо HOUSES, естественно Id_House...


 
Ega23 ©   (2006-06-06 10:14) [3]


> Что мне для этого нужно подставить в параметр :ID_HOUSE?


Для этого тебе надо ввесьт текст запроса
SELECT * FROM HOUSES WHERE :HOUSE_PARAM
определить параметр как string, поставить его равным по-умолчанию "0=0",
а потом заполнять Query1.ParamByName("HOUSES").AsString:="ID_HOUSE IN (2595, 2596, 2597)";


 
Быстрый Шу   (2006-06-06 10:15) [4]

вообщем извините за сумбурность, очень спешу, да и голова уже объята пламенем....)))


 
Ega23 ©   (2006-06-06 10:17) [5]


> а потом заполнять Query1.ParamByName("HOUSES").AsString:
> ="ID_HOUSE IN (2595, 2596, 2597)";
>

uery1.ParamByName("HOUSE_PARAM").AsString:="ID_HOUSE IN (2595, 2596, 2597)";

Я тоже опечатался...


 
Быстрый Шу   (2006-06-06 10:17) [6]

хм...а можно так?:

SELECT * FROM HOUSES WHERE ID_HOUSE IN (:HOUSE_PARAM)
а в :HOUSE_PARAM уже как строку передавать "2595, 2596, 2597"


 
Ega23 ©   (2006-06-06 10:19) [7]


> а в :HOUSE_PARAM уже как строку передавать "2595, 2596,
> 2597"


Можно и так. Ну тогда по-умолчанию "-1" параметр поставь.


 
Быстрый Шу   (2006-06-06 10:21) [8]

хм...у меня текст квери создаётся в процессе...и не мной, мне отдаётся на изменение только параметр...я могу только заранее "попросить" в каком виде запрос сделать..к чему я это говорю - обязательно значение по умолчанию ставить?


 
Ega23 ©   (2006-06-06 10:24) [9]

"Select ObjID from ObjectClasses where objid in ()"
Если так напишешь, то получишь ошибку Incorrect syntax near ")".
А если так
"Select ObjID from ObjectClasses where objid in (-1)"
то получишь пустую выборку.

Чуешь разницу?  :о)


 
Быстрый Шу   (2006-06-06 10:27) [10]

дак я ему QUERY1.OPEN делаю ТОЛЬКО после присвоения параметров...он что, квери типа препарсинга что-ли делаеть??? 8-()


 
Ega23 ©   (2006-06-06 10:29) [11]


> дак я ему QUERY1.OPEN делаю ТОЛЬКО после присвоения параметров.
> ..он что, квери типа препарсинга что-ли делаеть??? 8-()


Нет, ты не понял. Если у тебя ВСЕГДА ГАРАНТИРОВАННО есть какие-то числа - то тогда, конечно, -1 нафиг не нужна. Но если есть хоть малейший шанс, что чисел не будет (ну не выбрал пользователь ничего, например), то тогда при открытии запроса на exception нарвёшься.


 
Быстрый Шу   (2006-06-06 10:31) [12]

нда...сделал так:
Query1.sql.text:="Select * From HOUSES Where ID_House in (:Houses)";
затем,
Query.ParamByName("HOUSES").AsString:="2595, 2596, 2597";
затем делаю
Query1.Open;
и он мне вываливает ексепшин типа
Error converting data to a data type Integer......
что-то где-то я туплю......


 
Быстрый Шу   (2006-06-06 10:34) [13]

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


 
Ega23 ©   (2006-06-06 10:34) [14]


> Error converting data to a data type Integer......


тип у параметра сменил с ftInteger на ftString?


 
Быстрый Шу   (2006-06-06 10:40) [15]

у меня в коде(если опустить лишнее, не относящееся к делу)
вот такие строчки:

Query1.sql.text:="Select * From HOUSES Where ID_House in (:Houses)";
Query1.ParamByName("HOUSES").AsString:="2595, 2596, 2597";
Query1.Open;

я вроде нигде и не ставлю параметру тип ftInteger....он что, по умолчанию его ставит??
если он ставит по умолчанию, ок, как мне меж этих строк поменять тип параметра?


 
Sergey13 ©   (2006-06-06 10:41) [16]

2[14] Ega23 ©   (06.06.06 10:34)
Сомнительно мне, что такая конструкция вообще будет работать, ибо это макроподстановка, а не параметризация. Туда же и select можно впрудить.


 
sniknik ©   (2006-06-06 10:43) [17]

не получится, нет операций "IN переменная", есть только "IN перечисление" а переменной такого типа нет...

только
st:= "2595, 2596, 2597";
Query1.sql.text:="Select * From HOUSES Where ID_House in ("+st+")";


 
ЮЮ ©   (2006-06-06 10:45) [18]

Успокойся. Не может быть конструкция в  IN (xxx) быть параметром. Только динамическое создание SQL.

На худой конец
SQL := ReplaceStr(SQL,  "(:Id_House)", "(2595, 2596, 2597)")


 
Быстрый Шу   (2006-06-06 10:48) [19]

to {sniknik ©   (06.06.06 10:43) [17] }
вот-вот!
только проблема в том, что мне уже передают кверю с готовым текстом СКЛ, а я могу только через параметр свои данные в текст загнать
и вот такого Where ID_House in ("+st+")";, соответственно, делать не могу((((((
только через параметры компоненты квери...поэтому у меня и была мысль про перечисляемый тип...а его, значит нет...вот, мля, как же тогда быть?


 
Быстрый Шу   (2006-06-06 10:49) [20]

Йоптиль!!!!!!!
"ЮЮ" !!!!!!!!
Дай ка, свою мужественную руку пожать!!!!!!!!!!!
)))))))))))
СПАСИБО!
чё та я изначально протупил этот вариант........((((((


 
Быстрый Шу   (2006-06-06 10:50) [21]

упс)))
твою руку пожать))))))))
даже в этом ступил)))))щас опробирую!


 
saxon   (2006-06-06 10:50) [22]


> Быстрый Шу   (06.06.06 10:48) [19]

SP + параметер.


 
Ega23 ©   (2006-06-06 11:05) [23]

Не понял: я разве не могу строковый IN-параметр в запрос всобачить???


 
ЮЮ ©   (2006-06-06 11:07) [24]

>Ega23 ©   (06.06.06 11:05) [23]

Увы. Даже тебе это не дано :(


 
Ega23 ©   (2006-06-06 11:11) [25]


> Увы. Даже тебе это не дано :(
>


Во, блин... Не знал... Правда, я текст всегда динамически генерил...


 
Быстрый Шу   (2006-06-06 11:18) [26]

)))))))мне смешно до жути))))))
а где взять ReplaceStr ? 0:-))


 
Быстрый Шу   (2006-06-06 11:21) [27]

всё, вопрос отпал, нашёл)))


 
Sergey13 ©   (2006-06-06 11:22) [28]

2[23] Ega23 ©   (06.06.06 11:05)
Параметры подставляются после разбора запроса сервером. А в IN можно вставить все что угодно, включая вызов процедур. Отсюда и ограничения.


 
Desdechado ©   (2006-06-06 20:46) [29]

Ega23 ©   (06.06.06 11:05) [23]
Ошибку в [12] видел? А все из-за того, что после подстановки
Query1.sql.text:="Select * From HOUSES Where ID_House in (:Houses)";
Query.ParamByName("HOUSES").AsString:="2595, 2596, 2597";

получаем SQL вида
Select * From HOUSES Where ID_House in ("2595, 2596, 2597")
что, как сам понимаешь, совсем не то, что ожидалось



Страницы: 1 вся ветка

Текущий архив: 2006.08.13;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.048 c
2-1153753032
VitV
2006-07-24 18:57
2006.08.13
Форматирование текста в DBRichedit.


15-1149183547
tesseract
2006-06-01 21:39
2006.08.13
футболка DelphiMaster


3-1149768298
fuckman
2006-06-08 16:04
2006.08.13
Ошибка "Multiple record found, but only one was expected"


15-1153130774
QuickFinder
2006-07-17 14:06
2006.08.13
Слово о МЯСЕ


15-1152881936
Crazy monkey
2006-07-14 16:58
2006.08.13
Превед кросавчеги!