Ошибка усечения строки в параметризованных запросах Delphi DBExpress / Firebird

У меня есть запрос в Delphi с использованием DBExpress TSQLQuery, который выглядит так

ActiveSQL.sql.add('SELECT * FROM MYTABLE where MYFIELD=(:AMYFIELD) ');

ActiveSQL.ParamByName('AMYFIELD').AsString    := 'Some random string that is to long for the field';

ActiveSQL.Open;

Если я запускаю его, когда он выполняет команду открытия, я получаю следующее исключение

в классе TDBXError с сообщением «арифметическое исключение, числовое переполнение или усечение строки».

Это вызвано тем, что строка в AMYFIELD длиннее, чем длина поля таблицы, MYFIELD - это Varchar (10), если я сокращу ее до более короткой строки, она будет работать нормально, и если я добавлю строку непосредственно в SQL, например

  ActiveSQL.sql.add('SELECT * FROM MYTABLE where MYFIELD="Some random string that is to long for the field" ');

он работает нормально, то есть не жалуется на усечение, теперь, если бы это была вставка / обновление, я бы хотел знать об усечении, но, поскольку он только что использовался для поиска, я бы хотел его остановить.

Есть ли способ сообщить DBExpress, что можно обрезать мои строки? или есть работоспособный обходной путь для этого

Я бы не хотел добавлять что-то вроде

l_input: = копия (l_input, 0, fieldLength-1);

это выглядит неаккуратно и затрудняет поддержку кода.

Я использую Delphi 2007 с Firebird 2 через драйвер interbase, если это помогает?

ОБНОВИТЬ:

@ Эрик Засс, похоже, вы правы, я обнаружил сообщение об ошибке на сайте часто задаваемых вопросов по firebird http://www.firebirdfaq.org/faq79/

@ inzKulozik LeftStr работает нормально, хотя я не могу получить ActiveSQL.ParamByName ('AMYFIELD'). Размер для работы, но это все еще кажется мне беспорядочным и сложным в обслуживании.

Я также видел метод, который добавляет substr в SQL: что-то вроде

select * from mytable where myname = substr(:MYNAME,0,10)

Снова выглядит сложнее в обслуживании. В идеале мне нужен параметр конфигурации Firebird / DBExpress, который решает эту проблему, но пока я не найду его, я буду использовать решение inzKulozik и надеюсь, что структура таблицы не сильно изменится.


person Re0sless    schedule 24.12.2008    source источник
comment
Может быть, вам стоит установить ограничение максимальной длины в пользовательских элементах управления?   -  person inzKulozik    schedule 03.01.2009


Ответы (2)


l_input := copy(l_input,**0**,fieldLength-1);

Вы не можете скопировать подстроку с позиции 0!

Попробуй это:

l_input := LeftStr(l_input, fieldLength);

or

ActiveSQL.ParamByName('AMYFIELD').AsString := LeftStr('Some random string that is to long for the field', ActiveSQL.ParamByName('AMYFIELD').Size);

or

with ActiveSQL.ParamByName('AMYFIELD') do
  AsString := LeftStr('Some random string that is to long for the field', Size);
person inzKulozik    schedule 25.12.2008
comment
Я не знал о leftStr, я попробую в понедельник - person Re0sless; 26.12.2008

Это сообщение об ошибке от Firebird, а не от DBX. Я думаю, что DBX отправляет параметры в базу данных точно так, как вы их вводите, поэтому Firebird должна усечь его.

person Erick Sasse    schedule 26.12.2008