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