Форум: "Базы";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];
ВнизПодстановка параметров в 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.039 c