Sql Delphi DBExpress/Firebird参数化查询中的字符串截断错误
我在Delphi中有一个使用DBExpress TSQLQuery的查询,看起来是这样的Sql Delphi DBExpress/Firebird参数化查询中的字符串截断错误,sql,delphi,firebird,dbexpress,Sql,Delphi,Firebird,Dbexpress,我在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; 如果我运行它,当它执行ope
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
'算术异常,数字
溢出或字符串截断'
这是由于字段中的字符串比表字段长度长,MYFIELD是Varchar(10),如果我把它修剪成一个较短的字符串,它就可以正常工作,如果我像这样直接将字符串添加到SQL中
ActiveSQL.sql.add('SELECT * FROM MYTABLE where MYFIELD="Some random string that is to long for the field" ');
它工作正常,即不抱怨截断,现在如果这是一个插入/更新,我想知道截断,但因为它刚刚用于搜索,我想停止它
有没有办法告诉DBExpress可以截断字符串?还是有可行的解决办法
我想避免添加类似的内容
select * from mytable where myname = substr(:MYNAME,0,10)
l_输入:=复制(l_输入,0,字段长度-1)
as看起来很混乱,会使维护代码变得更困难
我正在通过interbase驱动程序将Delphi2007与Firebird 2一起使用,如果有帮助的话
更新:
@看起来你是对的,我在firebird常见问题解答网站上找到了错误消息
@LeftStr工作得很好,尽管我无法使用ActiveSQL.ParamByName('AMYFIELD')。大小,但这对我来说仍然很混乱,并且更难维护
我还看到了一种向SQL添加substr的方法:类似
select * from mytable where myname = substr(:MYNAME,0,10)
看起来更难维护,理想情况下,我希望使用Firebird/DBExpress配置设置来修复此问题,但在找到解决方案之前,我将使用inzKulozik的解决方案,希望表结构不会发生太大变化
l_input := copy(l_input,**0**,fieldLength-1);
无法从位置0复制子字符串
试试这个:
l_input := LeftStr(l_input, fieldLength);
或
或
此错误消息来自Firebird,而不是DBX。我认为DBX向数据库发送参数的方式与您输入的方式完全相同,因此截断它应该是Firebird的工作。我不知道leftStr,我将在星期一试一试也许您应该在用户控件中设置最大长度限制?
with ActiveSQL.ParamByName('AMYFIELD') do
AsString := LeftStr('Some random string that is to long for the field', Size);