我正在使用 Firebird 2.1、DevArt 的 DBExpress 驱动程序和 Delphi 2010。我的一些用于 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?
我在上一份工作中经常使用 firebird,当您已经在数据库中存储了一个大(长度)varchar 字段值并且您试图在 delphi 中“获取”字符串时,会发生此错误,请尝试更新中的值将 db 转换为较小(长度)的 varchar。我不确定是否适合您,但请尝试一下。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)