-
Подскажите, пожалуйста, я использую базу 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 - все равно таже ошибка
-
Params - это параметры запроса, которые отправляются серверу, когда запросу уже скомпилирован. То есть это подходит для полей наборов данных. Тебе же нужно передать в UDF параметр, что IB/FB за тебя не сделает, т.к. этот механизм на UDF не распространяется. Присваивай явно:
IBQuery1.SQL.TEXT:='select t.* from tov t where CheckA(t.kod,'''+'1;2;3'+''') = 1 ';
-
> IBQuery1.ParamByName('bb').AsString:='1;2;3';
Ну а предварительное IBQuery1.ParamByName('bb').DataType:= ftString не поможет?
-
> Ну а предварительное IBQuery1.ParamByName('bb').DataType:= ftString не поможет?
Не поможет.
-
> Не поможет.
больно ты категоричен версия сервера у автора не указана у меня на 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;
-
Да, я попробовал последний пример, он работает, но это если параметр является числом. А если параметр строка, то опять таже ошибка: Dynamic SQL Error. SQL Error Code=-804. Data type unknown.
Пробовал предварительно поставить IBQuery1.ParamByName('bb').DataType:= ftString - не помогает. Может быть нужно как-то по другому писать функцию для работы с параметрами? сервер - Firebird-1.5.2.4731-Win32
|