【问题标题】:String truncation error in Delphi DBExpress/Firebird paramatised queriesDelphi DBExpress/Firebird 参数化查询中的字符串截断错误
【发布时间】: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


【解决方案1】:
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);

【讨论】:

  • 我不知道leftStr,我星期一试试
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多