Использование параметров в запросе FIBDataSet

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
Михаил
Сообщения: 3
Зарегистрирован: 12 янв 2005, 14:37

Использование параметров в запросе FIBDataSet

Сообщение Михаил » 12 янв 2005, 15:05

В запросе использую параметр :IDS
Из C++Builder в runtime устанавливаю его значение:
DataSet1->ParamByName("ids")->AsString = "45,46,47,50,58";
На входе строка, содержащая набор чисел, разделенных запятыми,
после установки значения параметра происходит замена всех запятых на точки, т.е.
параметр содержит:
45.46.47.50.58
В параметре необходимо использование запятых.
Помогите, пожалуйста, избавиться от этой проблемы.
P.S.
При заполнении поля, например, DataSet1->FieldByName("somestr")->AsString = "45,46,47,50,58";
такой проблемы нет.

Михаил
Сообщения: 3
Зарегистрирован: 12 янв 2005, 14:37

Сообщение Михаил » 12 янв 2005, 17:58

Кусок запроса:
...
WHERE parent_id IN (:IDS)
...

Видимо, параметр приводится к типу parent_id, т.е. integer
Но как заставить :IDS быть строковым?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 12 янв 2005, 18:09

ух, ох... просто параметр допускает только ОДНО значение. Почему у тебя возникла мысль, что можно так написать - науке неизвестно. Откуда серверу догадаться, что ты передаешь перечень значений, конкретного типа, разделенных специфическим разделителем? Да еще вместо числа (как я понял), передаешь набор символов в виде строки.

Сейчас придет Merlin, подскажет как надо. я все время забываю его метод для такого in, надо будет в faq воткнуть...

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 12 янв 2005, 19:30

kdv писал(а):ух, ох... просто параметр допускает только ОДНО значение. Почему у тебя возникла мысль, что можно так написать - науке неизвестно. Откуда серверу догадаться, что ты передаешь перечень значений, конкретного типа, разделенных специфическим разделителем? Да еще вместо числа (как я понял), передаешь набор символов в виде строки.

Сейчас придет Merlin, подскажет как надо. я все время забываю его метод для такого in, надо будет в faq воткнуть...
Вообще-то мой метод при работе с клиента прост - раз такой запрос не может быть параметрическим, то я и не использую параметры, а между close и open пересобираю текст запроса, вставляя в него требуемую строку :wink: Вот если такое требуется внутри процедуры, где запрос не пересобрать (с появлением execute statement стало менее актуально, если этот запрос не внутри цикла, то можно и пересобрать), тогда делаю так. Собираю строку с параметрами вот в таком виде

'~12~23~267~675~'

и запрос пишу типа

Select тыры-пыры
From Table T
Where :ParamStr Containing '~'||T.ID||'~'

тильду в качестве разделителя списка выбрал потому, что этот символ имеет наименьшие шансы встретиться внутри ID если это строковое поле. Кстати, этот фокус порой выигрывает у IN по быстродействию. Ты уж воткни, а то каждый месяц как попугай повторяю :D

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 12 янв 2005, 19:51


Михаил
Сообщения: 3
Зарегистрирован: 12 янв 2005, 14:37

Сообщение Михаил » 13 янв 2005, 10:47

Спасибо за совет, очень дельный.
Я вчера уже сам понял, что параметр передается серверу один. Только вот жутко не хотелось собирать запрос по частям - хотелось обойтись очень удобной подстановкой параметра (я считал, что параметр заменяется клиентом при формировании запроса, а не передается серверу, поэтому и наморозил ерунды).
Еще раз спасибо, ветку можно закрывать.

Odysseos
Сообщения: 9
Зарегистрирован: 27 окт 2004, 14:24

макросы в FIBPlus

Сообщение Odysseos » 13 янв 2005, 20:56

Спасибо за метод с ":param containing" - оригинально :)

...Но если говорить именно про FIBPlus - то у них есть такая замечательная вещь, как макроподстановки. Макросы в тексте запросов выделяются не символвами ":" или "?", а символом "@" (есть и "полная" форма их записи - с заданием значения по умолчанию), и с точки зрения компонентов FIBPlus являются обычными параметрами. То есть - мы можем написать в запросе так:

Код: Выделить всё

where id in [@ids]
, и теперь у нас будет параметр (к которому можно обратиться через стандартный ParamByName('ids')), который не будет посылаться на сервер как параметр запроса - вместо этого, перед отправкой на сервер, сам запрос будет модифицирован, и непосредственно в его текст будет подставлено значение, которое мы зададим этому макросу (через значение соответствующего параметра):

Код: Выделить всё

ParamByName('ids').AsString := '1, 2, 3, 4, 5, 10, 20';
поменяет запрос таким образом:

Код: Выделить всё

where id in [1, 2, 3, 4, 5, 10, 20]
Подробней про макросы можно почитать тут:

http://www.stimul.com.ua/akhelp/params.htm

или тут (PDF в ZIP'е):

http://fibplus.com.ua/request.php?10

Ответить