我在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的解决方案并希望表结构不会改变太多。
答案 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作为截断它。