Использование параметров в запросе FIBDataSet
Модератор: kdv
Использование параметров в запросе FIBDataSet
В запросе использую параметр :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";
такой проблемы нет.
Из 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";
такой проблемы нет.
ух, ох... просто параметр допускает только ОДНО значение. Почему у тебя возникла мысль, что можно так написать - науке неизвестно. Откуда серверу догадаться, что ты передаешь перечень значений, конкретного типа, разделенных специфическим разделителем? Да еще вместо числа (как я понял), передаешь набор символов в виде строки.
Сейчас придет Merlin, подскажет как надо. я все время забываю его метод для такого in, надо будет в faq воткнуть...
Сейчас придет Merlin, подскажет как надо. я все время забываю его метод для такого in, надо будет в faq воткнуть...
Вообще-то мой метод при работе с клиента прост - раз такой запрос не может быть параметрическим, то я и не использую параметры, а между close и open пересобираю текст запроса, вставляя в него требуемую строку Вот если такое требуется внутри процедуры, где запрос не пересобрать (с появлением execute statement стало менее актуально, если этот запрос не внутри цикла, то можно и пересобрать), тогда делаю так. Собираю строку с параметрами вот в таком видеkdv писал(а):ух, ох... просто параметр допускает только ОДНО значение. Почему у тебя возникла мысль, что можно так написать - науке неизвестно. Откуда серверу догадаться, что ты передаешь перечень значений, конкретного типа, разделенных специфическим разделителем? Да еще вместо числа (как я понял), передаешь набор символов в виде строки.
Сейчас придет Merlin, подскажет как надо. я все время забываю его метод для такого in, надо будет в faq воткнуть...
'~12~23~267~675~'
и запрос пишу типа
Select тыры-пыры
From Table T
Where aramStr Containing '~'||T.ID||'~'
тильду в качестве разделителя списка выбрал потому, что этот символ имеет наименьшие шансы встретиться внутри ID если это строковое поле. Кстати, этот фокус порой выигрывает у IN по быстродействию. Ты уж воткни, а то каждый месяц как попугай повторяю
Спасибо за совет, очень дельный.
Я вчера уже сам понял, что параметр передается серверу один. Только вот жутко не хотелось собирать запрос по частям - хотелось обойтись очень удобной подстановкой параметра (я считал, что параметр заменяется клиентом при формировании запроса, а не передается серверу, поэтому и наморозил ерунды).
Еще раз спасибо, ветку можно закрывать.
Я вчера уже сам понял, что параметр передается серверу один. Только вот жутко не хотелось собирать запрос по частям - хотелось обойтись очень удобной подстановкой параметра (я считал, что параметр заменяется клиентом при формировании запроса, а не передается серверу, поэтому и наморозил ерунды).
Еще раз спасибо, ветку можно закрывать.
макросы в FIBPlus
Спасибо за метод с ":param containing" - оригинально
...Но если говорить именно про FIBPlus - то у них есть такая замечательная вещь, как макроподстановки. Макросы в тексте запросов выделяются не символвами ":" или "?", а символом "@" (есть и "полная" форма их записи - с заданием значения по умолчанию), и с точки зрения компонентов FIBPlus являются обычными параметрами. То есть - мы можем написать в запросе так:
, и теперь у нас будет параметр (к которому можно обратиться через стандартный ParamByName('ids')), который не будет посылаться на сервер как параметр запроса - вместо этого, перед отправкой на сервер, сам запрос будет модифицирован, и непосредственно в его текст будет подставлено значение, которое мы зададим этому макросу (через значение соответствующего параметра):
поменяет запрос таким образом:
Подробней про макросы можно почитать тут:
http://www.stimul.com.ua/akhelp/params.htm
или тут (PDF в ZIP'е):
http://fibplus.com.ua/request.php?10
...Но если говорить именно про FIBPlus - то у них есть такая замечательная вещь, как макроподстановки. Макросы в тексте запросов выделяются не символвами ":" или "?", а символом "@" (есть и "полная" форма их записи - с заданием значения по умолчанию), и с точки зрения компонентов FIBPlus являются обычными параметрами. То есть - мы можем написать в запросе так:
Код: Выделить всё
where id in [@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