![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подстановка параметров в TQuery [D6, D7, MSSQL]
Быстрый Шу © (2006-06-06 10:11:00)Добрый день!
вообщем задача такова:
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?
Desdechado (2006-06-06 20:46:00) [1]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")
что, как сам понимаешь, совсем не то, что ожидалось
Sergey13 (2006-06-06 11:22:00) [2]2[23] Ega23 © (06.06.06 11:05)
Параметры подставляются после разбора запроса сервером. А в IN можно вставить все что угодно, включая вызов процедур. Отсюда и ограничения.
Быстрый Шу (2006-06-06 11:21:00) [3]всё, вопрос отпал, нашёл)))
Быстрый Шу (2006-06-06 11:18:00) [4])))))))мне смешно до жути))))))
а где взять ReplaceStr ? 0:-))
Ega23 (2006-06-06 11:11:00) [5]
> Увы. Даже тебе это не дано :(
>
Во, блин... Не знал... Правда, я текст всегда динамически генерил...
ЮЮ (2006-06-06 11:07:00) [6]>Ega23 © (06.06.06 11:05) [23]
Увы. Даже тебе это не дано :(
Ega23 (2006-06-06 11:05:00) [7]Не понял: я разве не могу строковый IN-параметр в запрос всобачить???
saxon (2006-06-06 10:50:00) [8]
> Быстрый Шу (06.06.06 10:48) [19]
SP + параметер.
Быстрый Шу (2006-06-06 10:50:00) [9]упс)))
твою руку пожать))))))))
даже в этом ступил)))))щас опробирую!
Быстрый Шу (2006-06-06 10:49:00) [10]Йоптиль!!!!!!!
"ЮЮ" !!!!!!!!
Дай ка, свою мужественную руку пожать!!!!!!!!!!!
)))))))))))
СПАСИБО!
чё та я изначально протупил этот вариант........((((((
Быстрый Шу (2006-06-06 10:48:00) [11]to {sniknik © (06.06.06 10:43) [17] }
вот-вот!
только проблема в том, что мне уже передают кверю с готовым текстом СКЛ, а я могу только через параметр свои данные в текст загнать
и вот такогоWhere ID_House in ('+st+')';, соответственно, делать не могу((((((
только через параметры компоненты квери...поэтому у меня и была мысль про перечисляемый тип...а его, значит нет...вот, мля, как же тогда быть?
ЮЮ (2006-06-06 10:45:00) [12]Успокойся. Не может быть конструкция в IN (xxx) быть параметром. Только динамическое создание SQL.
На худой конец
SQL := ReplaceStr(SQL, '(:Id_House)', '(2595, 2596, 2597)')
sniknik (2006-06-06 10:43:00) [13]не получится, нет операций "IN переменная", есть только "IN перечисление" а переменной такого типа нет...
только
st:= '2595, 2596, 2597';
Query1.sql.text:='Select * From HOUSES Where ID_House in ('+st+')';
Sergey13 (2006-06-06 10:41:00) [14]2[14] Ega23 © (06.06.06 10:34)
Сомнительно мне, что такая конструкция вообще будет работать, ибо это макроподстановка, а не параметризация. Туда же и select можно впрудить.
Быстрый Шу (2006-06-06 10:40:00) [15]у меня в коде(если опустить лишнее, не относящееся к делу)
вот такие строчки:
Query1.sql.text:='Select * From HOUSES Where ID_House in (:Houses)';
Query1.ParamByName('HOUSES').AsString:='2595, 2596, 2597';
Query1.Open;
я вроде нигде и не ставлю параметру тип ftInteger....он что, по умолчанию его ставит??
если он ставит по умолчанию, ок, как мне меж этих строк поменять тип параметра?
Ega23 (2006-06-06 10:34:00) [16]
> Error converting data to a data type Integer......
тип у параметра сменил с ftInteger на ftString?
Быстрый Шу (2006-06-06 10:34:00) [17]нет, всегда будет число...ввод пользователя я предварительно обрабатываю...если, что хоть что-нить, но я туда запишу...так что я так понял значение по умолчанию отпадает.....
а вот что он конвертировать собирается........см. выше....
Быстрый Шу (2006-06-06 10:31:00) [18]нда...сделал так:
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......
что-то где-то я туплю......
Ega23 (2006-06-06 10:29:00) [19]
> дак я ему QUERY1.OPEN делаю ТОЛЬКО после присвоения параметров.
> ..он что, квери типа препарсинга что-ли делаеть??? 8-()
Нет, ты не понял. Если у тебя ВСЕГДА ГАРАНТИРОВАННО есть какие-то числа - то тогда, конечно, -1 нафиг не нужна. Но если есть хоть малейший шанс, что чисел не будет (ну не выбрал пользователь ничего, например), то тогда при открытии запроса на exception нарвёшься.
Быстрый Шу (2006-06-06 10:27:00) [20]дак я ему QUERY1.OPENделаю ТОЛЬКО после присвоения параметров...он что, квери типа препарсинга что-ли делаеть??? 8-()