Ошибка усечения строки в параметризованных запросах Delphi DBExpress / Firebird - PullRequest
2 голосов
/ 24 декабря 2008

У меня есть запрос в 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: = copy (l_input, 0, fieldLength-1);

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

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

UPDATE:

@ Erick Sasse похоже, что вы правы, я нашел сообщение об ошибке на сайте FAQ 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 и надеюсь, что структура таблицы не сильно изменится.

Ответы [ 2 ]

2 голосов
/ 26 декабря 2008

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

2 голосов
/ 25 декабря 2008
l_input := copy(l_input,**0**,fieldLength-1);

Нельзя скопировать подстроку с позиции 0!

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

l_input := LeftStr(l_input, fieldLength);

или

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

или

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