代码之家  ›  专栏  ›  技术社区  ›  Re0sless

Delphi DBExpress/FireBird参数化查询中的字符串截断错误

  •  2
  • Re0sless  · 技术社区  · 16 年前

    我在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 '算术异常,数字 溢出或字符串截断。

    这是由于a myfield中的字符串比tables字段长度长,myfield是varchar(10),如果我将其修剪为较短的字符串,它会正常工作,并且如果我像这样直接将字符串添加到SQL中

      ActiveSQL.sql.add('SELECT * FROM MYTABLE where MYFIELD="Some random string that is to long for the field" ');
    

    它工作正常,也就是说,不抱怨截断,现在如果这是一个插入/更新,我想知道截断,但因为它只是用于搜索,我想停止它。

    是否有任何方法可以告诉dbexpress截断字符串是可以的?或者有什么可行的办法

    我想避免添加

    L_输入:=copy(L_输入,0,fieldlength-1);

    因为看起来很混乱,这会使代码维护更加困难。

    我正在通过Interbase驱动程序使用Delphi2007和Firebird 2,如果这有帮助的话?

    更新:

    @ Erick Sasse 看起来是你的权利,我在Firebird常见问题网站上找到了错误消息 http://www.firebirdfaq.org/faq79/

    @ inzKulozik leftstr工作得很好,虽然我不能得到activesql.parambyname(“amyfield”).size来工作,但是这对我来说仍然很混乱,而且很难维护。

    我还看到了一个向SQL添加SUBSTR的方法:类似于

    select * from mytable where myname = substr(:MYNAME,0,10)
    

    再次看起来很难维护,理想情况下我想要一个Firebird/DBExpress配置设置来解决这个问题,但是在我找到一个Firebird/DBExpress配置设置之前,我会使用inzkulozik的解决方案,希望表结构不会发生太大的变化。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Patrick Gryciuk    16 年前
    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);
    
        2
  •  1
  •   Erick Sasse    16 年前

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