2010-07-28 122 views
2

我用火鸟2.1,从DevArt和德尔福2010年我的一些报道dbExpress驱动程序是使用Delphi 2006的工作停止工作,并制作表示“算术异常,数值溢出错误消息,或字符串截断“已发生。在我的代码这一点上发生错误:字符串截断的ClientDataSet

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 

由于这个曾经在2006年德尔福工作没有CAST,我认为新的行为是由于一个更新的TClientdataSet。拥有旧的,更宽容的行为将是很好的。是否有配置的ClientDataSet接受这种没有抱怨或者我只是需要告诉我的用户CAST基于IIF和CASE语句字符串结果的方式吗?

回答

0

好了,有了一点经验,它看起来像我看到这个截断误差一致显示了德尔福2010版ClientDatasets的。如果我找到一个不涉及在查询中使用CAST的解决方案,我会在这里发布它。但现在,我要关闭这个帖子。

0

我曾经在firebird上工作过很多,当你已经在db中存储了一个很大的(长度)varchar字段值时,这个错误会发生,你试图在delphi中“获取”字符串,试试将数据库中的值更新为较小的(长度)varchar。我不确定是否会为你工作,但尝试一下。

+0

它实际上好像火鸟正确地做它的工作这一点。数据从Firebird数据库中的varchar(10)字段转换为TSQLQuery。在将数据通过数据集提供者传输到客户端数据集的步骤中出现问题。我猜测,当客户端数据集获得基于函数或CASE语句的字段,它不知道的领域可能要持续获得可惜设置接收字段的长度在任何长度数据的第一个实例。这可能是唯一的解决办法就是我所做的CAST。 – jrodenhi 2010-07-29 20:09:02