【发布时间】:2008-12-24 12:28:53
【问题描述】:
我在 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 := 复制(l_input,0,fieldLength-1);
因为看起来很乱,并且会使代码维护变得更加困难。
如果有帮助,我正在通过 interbase 驱动程序将 Delphi 2007 与 Firebird 2 一起使用?
更新:
@Erick Sasse好像是你的权利,我在firebird FAQ网站http://www.firebirdfaq.org/faq79/找到了错误信息
@inzKulozik LeftStr 工作正常,虽然我无法让 ActiveSQL.ParamByName('AMYFIELD').Size 工作,但这对我来说仍然很乱,而且更难维护。
我还看到了一种在 SQL 中添加 substr 的方法:类似于
select * from mytable where myname = substr(:MYNAME,0,10)
再次看起来更难维护,理想情况下,我想要一个 Firebird/DBExpress 配置设置来解决这个问题,但在我找到一个之前,我会使用 inzKulozik 的解决方案,并希望表结构不会发生太大变化。
【问题讨论】:
-
也许您应该在用户控件中设置最大长度限制?
标签: sql delphi firebird dbexpress