我正在使用Firebird 2.1,来自DevArt和Delphi 2010的DBExpress驱动程序。我之前使用Delphi 2006的一些报告停止工作并产生一条错误消息,指出“算术异常,数字溢出或字符串截断”发生了。我的代码中发生了错误:
cds.Data := dsProvider.Data;
我在SQL语句中找到导致错误的地方:
iif(ytd.hPayType <> -1,t.sCode, 'NET') sPayType
T.sCode是Varchar(10)字段。我的结论是查询将数据返回给dsProvider,并且当dsProvider.Data传递给cds.Data时,cds组件根据它接收的第一个值设置字段宽度。如果我将“iif”更改为CASE语句,我会收到相同的错误消息。我设法解决了这个问题:
CAST(iif(ytd.hPayType <> -1,t.sCode, 'NET') AS varchar(10)) sPayType
由于这曾经在没有CAST的Delphi 2006中工作,我认为新行为是由于对TClientDataset的更新。拥有旧的,更宽容的行为会很好。有没有办法配置ClientDataset接受这个没有投诉或我是否需要告诉我的用户基于iif和CASE语句的字符串结果CAST?
答案 0 :(得分:0)
我以前在上一份工作中经常使用firebird工作,当你已经在db中存储了一个大的(长度)varchar字段值并且你试图在delphi中“获取”字符串时会发生这个错误,请尝试更新db中的值为较小(长度)的varchar。我不确定是否适合你,但试一试。
答案 1 :(得分:0)
嗯,有了更多的经验,看起来我看到这个截断错误与Delphi 2010版本的ClientDatasets一致。如果我找到一个不涉及在查询中使用CAST的解决方案,我会在此处发布。但就目前而言,我将结束此帖。