У меня есть запрос в 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 и надеюсь, что структура таблицы не сильно изменится.