Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подстановка параметров в TQuery [D6, D7, MSSQL]


Страницы:   1 2

Быстрый Шу ©   (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-()


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо