Конференция "Базы" » Использование UDF функции в запросе с параметрами [D5]
 
  • AlexeyMir (09.03.08 23:56) [0]
    Подскажите, пожалуйста, я использую базу Firebird.
    Я написал функцию UDF CheckA(CSTRING(254), CSTRING(2000)):INTEGER второй параметр состоит из списка значений разделенных ';', функция возвращает 1, если значение первого параметра присутствует в списке значений второго параметра, если нет то - 0.
    Пишу IBQuery1.SQL.TEXT:='select * from tov where CheckA(kod,"1;2;3")=1'  - работает замечательно

    а если
    IBQuery1.SQL.TEXT:='select * from tov where CheckA(kod,:bb)=1';
    IBQuery1.ParamByName('bb').AsString:='1;2;3';
    IBQuery[i_query].Open;
    Ругается: Dynamic SQL Error. SQL Error Code=-804. Data type unknown.

    Пробовал и через инспектор объектов Params,  добавлять параметр bb, указывал DataType, ParamType, Value, Value.Type - все равно таже ошибка
  • PEAKTOP © (10.03.08 03:31) [1]
    Params - это параметры запроса, которые отправляются серверу, когда запросу уже скомпилирован. То есть это подходит для полей наборов данных. Тебе же нужно передать в UDF параметр, что IB/FB за тебя не сделает, т.к. этот механизм на UDF не распространяется.

    Присваивай явно:

    IBQuery1.SQL.TEXT:='select t.* from tov t where CheckA(t.kod,'''+'1;2;3'+''') = 1 ';

  • DrPass © (10.03.08 11:15) [2]

    > IBQuery1.ParamByName('bb').AsString:='1;2;3';

    Ну а предварительное IBQuery1.ParamByName('bb').DataType:= ftString не поможет?
  • PEAKTOP © (10.03.08 14:50) [3]
    > Ну а предварительное IBQuery1.ParamByName('bb').DataType:= ftString не поможет?

    Не поможет.
  • Правильный_Вася (10.03.08 16:00) [4]

    > Не поможет.

    больно ты категоричен
    версия сервера у автора не указана
    у меня на D7, FB 1.53 прекрасно проходит запрос
    select t.* from objnames t where substr(t.obj_name,1,:x)='1'


    правда, юзаю dbexpress, а не ibexpress, но у автора ругается сервер, поэтому компоненты доступа тут ни при чем
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    sqldataset1.ParamByName('x').asinteger:=3;
    sqldataset1.Open;
    application.MessageBox('получилось','ура');
    end;

  • AlexeyMir (11.03.08 16:25) [5]
    Да, я попробовал последний пример, он работает, но это если параметр является числом. А если параметр строка, то опять таже ошибка: Dynamic SQL Error. SQL Error Code=-804. Data type unknown.

    Пробовал предварительно поставить IBQuery1.ParamByName('bb').DataType:= ftString - не помогает.
    Может быть нужно как-то по другому писать функцию для работы с параметрами?
    сервер - Firebird-1.5.2.4731-Win32
 
Конференция "Базы" » Использование UDF функции в запросе с параметрами [D5]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]