2

我在 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 的解决方案,并希望表结构不会发生太大变化。

4

2 回答 2

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);
于 2008-12-25T12:24:07.273 回答
2

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

于 2008-12-26T11:24:27.503 回答