我正在使用 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?