Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 传输到ClientDataset时的字符串截断_Delphi_Firebird_Dbexpress - Fatal编程技术网

Delphi 传输到ClientDataset时的字符串截断

Delphi 传输到ClientDataset时的字符串截断,delphi,firebird,dbexpress,Delphi,Firebird,Dbexpress,我正在使用Firebird 2.1,来自DevArt和Delphi 2010的DBExpress驱动程序。我的一些用于Delphi 2006的报告停止工作,并生成一条错误消息,指示发生了“算术异常、数字溢出或字符串截断”。错误发生在我的代码中的这一点上: cds.Data := dsProvider.Data; 我在SQL语句中找到了导致错误的位置: iif(ytd.hPayType <> -1,t.sCode, 'NET') sPayType iif(ytd.hPayType-

我正在使用Firebird 2.1,来自DevArt和Delphi 2010的DBExpress驱动程序。我的一些用于Delphi 2006的报告停止工作,并生成一条错误消息,指示发生了“算术异常、数字溢出或字符串截断”。错误发生在我的代码中的这一点上:

cds.Data := dsProvider.Data;
我在SQL语句中找到了导致错误的位置:

iif(ytd.hPayType <> -1,t.sCode, 'NET') sPayType
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(iif(ytd.hPayType-1,t.sCode,'NET')作为varchar(10))sPayType

由于这在Delphi2006中没有强制转换,因此我假设新的行为是由于TClientDataset的更新。如果能有一种古老的、更宽容的行为,那就太好了。有没有办法将ClientDataset配置为毫无怨言地接受此结果,或者我需要告诉用户根据iif和CASE语句对字符串结果进行强制转换?

我在上一份工作中经常使用firebird,当您已经有一个较大的(长度)时,会发生此错误存储在db中的varchar字段值,如果要在delphi中“获取”字符串,请尝试将db中的值更新为较小(长度)的varchar。我不确定是否适合您,但请试一试。

我在上一份工作中经常与firebird一起工作,当您在数据库中已经存储了一个较大(长度)的varchar字段值,并且您试图在delphi中“获取”字符串时,会发生此错误,请尝试将数据库中的值更新为较小(长度)的varchar。我不确定是否适合您,但请尝试一下。

好吧,再加上一点经验,我似乎看到这个截断错误与Delphi 2010版的ClientDataSet一致。如果我找到一个不需要在查询中使用CAST的解决方案,我会把它发布在这里。但现在,我要结束这篇文章。

好吧,再加上一点经验,我似乎看到这个截断错误与Delphi 2010版的ClientDataSet一致。如果我找到一个不需要在查询中使用CAST的解决方案,我会把它发布在这里。但现在,我要结束这篇帖子。

实际上,Firebird似乎在这方面做得很好。数据来自Firebird数据库中的varchar(10)字段,进入TSQLQuery。在通过数据集提供程序将此数据传输到客户端数据集的步骤中,会出现问题。我推测,当客户机数据集基于函数或CASE语句获取字段时,它不知道该字段可能会获取多长时间,但不幸的是,它将接收字段的长度设置为第一个数据实例的长度。这可能是唯一的解决办法是我的演员阵容。事实上,看起来Firebird在这方面做得很好。数据来自Firebird数据库中的varchar(10)字段,进入TSQLQuery。在通过数据集提供程序将此数据传输到客户端数据集的步骤中,会出现问题。我推测,当客户机数据集基于函数或CASE语句获取字段时,它不知道该字段可能会获取多长时间,但不幸的是,它将接收字段的长度设置为第一个数据实例的长度。这可能是唯一的解决办法是我做的演员。