Delphi DBExpress / Firebird paramatised查询中的字符串截断错误

时间:2008-12-24 12:28:53

标签: sql delphi firebird dbexpress

我在Delphi中使用看起来像这样的DBExpress TSQL查询

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中的

  '算术异常,数字   溢出或字符串截断'。

这是由于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);

看起来很乱,会让代码更难维护。

如果有帮助,我通过interbase驱动程序使用Delphi 2007和Firebird 2吗?

更新:

@ Erick Sasse看起来你的权利,我在firebird常见问题解答网站上发现了错误消息http://www.firebirdfaq.org/faq79/

@ inzKulozik LeftStr运行正常,虽然我无法获得ActiveSQL.ParamByName('AMYFIELD')。尺寸可以工作,但这对我来说仍然很麻烦,而且难以维护。

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

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

再次看起来难以维护,理想情况下我想要一个Firebird / DBExpress配置设置来修复这个问题,但是直到我找到一个我会选择inzKulozik的解决方案并希望表结构不会改变太多。

2 个答案:

答案 0 :(得分:2)

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);

答案 1 :(得分:2)

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