6月 272014
 

在Delphi7中,使用TAdoQuery读取sybase中的数据,发现在读取numeric字段时,本来存储的是负数值,但tadoquery读出后为正数。

select workdays from workinfo

后来gg了一下,发现这是delphi的一个bug,用Delphi 2010写了一小工具,发现读取不会出现负数为正的情况,说明在后来的delphi版本中修正了此错误。跟踪代码时发现在adodb.pas中的GetFieldData函数中的子函数VarToBuffer中,delphi 2010和delphi 7有所区别,具体代码片断如下:

ftAutoInc, ftInteger:
Integer(Buffer^) := lVal;

将adodb.pas文件拷贝到工程目录下,并将delphi 2010中的此行代码拷贝到这个文件中,发现问题确实解决了,但是修改delphi的源文件还是容易为以后的开发带来隐患,所以还需要其他的办法来解决此问题。

既然是读取numeric字段会报错,那么我们可以想办法把这个字段动态的改变为其他的类型,在sql语句中通过一些数学运算即可改变,最简单的就是跟这个字段除以1(乘以1不会改变),所以最简单的解决办法就是如下更改sql语句:

select workdays / 1 as workdays from workinfo

这样就轻松解决了问题,如果大家遇到类似的问题也可以考虑这种办法来解决问题。

打赏