Sql Delphi DBExpress/Firebird参数化查询中的字符串截断错误

Sql Delphi DBExpress/Firebird参数化查询中的字符串截断错误,sql,delphi,firebird,dbexpress,Sql,Delphi,Firebird,Dbexpress,我在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; 如果我运行它,当它执行ope

我在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;
如果我运行它,当它执行open命令时,我会得到以下异常

类中包含消息的TDBXError '算术异常,数字 溢出或字符串截断'

这是由于字段中的字符串比表字段长度长,MYFIELD是Varchar(10),如果我把它修剪成一个较短的字符串,它就可以正常工作,如果我像这样直接将字符串添加到SQL中

  ActiveSQL.sql.add('SELECT * FROM MYTABLE where MYFIELD="Some random string that is to long for the field" ');
它工作正常,即不抱怨截断,现在如果这是一个插入/更新,我想知道截断,但因为它刚刚用于搜索,我想停止它

有没有办法告诉DBExpress可以截断字符串?还是有可行的解决办法

我想避免添加类似的内容

select * from mytable where myname = substr(:MYNAME,0,10)
l_输入:=复制(l_输入,0,字段长度-1)

as看起来很混乱,会使维护代码变得更困难

我正在通过interbase驱动程序将Delphi2007与Firebird 2一起使用,如果有帮助的话

更新:

@看起来你是对的,我在firebird常见问题解答网站上找到了错误消息

@LeftStr工作得很好,尽管我无法使用ActiveSQL.ParamByName('AMYFIELD')。大小,但这对我来说仍然很混乱,并且更难维护

我还看到了一种向SQL添加substr的方法:类似

select * from mytable where myname = substr(:MYNAME,0,10)
看起来更难维护,理想情况下,我希望使用Firebird/DBExpress配置设置来修复此问题,但在找到解决方案之前,我将使用inzKulozik的解决方案,希望表结构不会发生太大变化

l_input := copy(l_input,**0**,fieldLength-1);
无法从位置0复制子字符串

试试这个:

l_input := LeftStr(l_input, fieldLength);


此错误消息来自Firebird,而不是DBX。我认为DBX向数据库发送参数的方式与您输入的方式完全相同,因此截断它应该是Firebird的工作。

我不知道leftStr,我将在星期一试一试也许您应该在用户控件中设置最大长度限制?
with ActiveSQL.ParamByName('AMYFIELD') do
  AsString := LeftStr('Some random string that is to long for the field', Size);