2

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

4

2 回答 2

0

好吧,有了更多经验,我似乎看到这个截断错误与 Delphi 2010 版本的 ClientDatasets 一致。如果我找到不需要在查询中使用 CAST 的解决方案,我将在此处发布。但是现在,我将关闭此帖子。

于 2010-08-20T20:59:20.200 回答
0

我在上一份工作中经常使用 firebird,当您已经在 db 中存储了一个大(长度)varchar 字段值并且您试图在 delphi 中“获取”字符串时,会发生此错误,尝试更新值db 到更小(长度)的 varchar。我不确定是否对你有用,但试试看。

于 2010-07-29T16:35:51.390 回答