我在 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 中,带有消息“算术异常、数字溢出或字符串截断”。
这是由于 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);
因为看起来很乱,并且会使维护代码更加困难。
如果有帮助,我正在通过 interbase 驱动程序将 Delphi 2007 与 Firebird 2 一起使用?
更新:
@Erick Sasse看起来像你的权利,我在火鸟常见问题解答网站http://www.firebirdfaq.org/faq79/上找到了错误消息
@ inzKulozik LeftStr 工作正常,虽然我无法让 ActiveSQL.ParamByName('AMYFIELD').Size 工作,但这对我来说仍然很乱,而且更难维护。
我还看到了一种将 substr 添加到 SQL 的方法:类似于
select * from mytable where myname = substr(:MYNAME,0,10)
再次看起来更难维护,理想情况下,我想要一个 Firebird/DBExpress 配置设置来解决这个问题,但在我找到一个之前,我会使用 inzKulozik 的解决方案,并希望表结构不会发生太大变化。