SELECT A,B FROM C
这里A是一个整数,B是一个小数.
如果在数据库中A和B都是负数的话,那么通过ADO取出来的A就是一个正数,B是负数.如果把ADO换成DBEXPRESS或BDE的话,就可以正确地读出A的值了.所以我怀疑这可能是ADO的一个BUG.
解决这个问题有一个办法,将SQL语句这么改一下:
SELECT A-0,B FROM C
这样就可以读出A的正确的数值,但是这样操作是比较麻烦的,不知道大家有没有什么好的办法.

解决方案 »

  1.   

    几年前我在使用ADO时就遇到这个问题了.
    我用的是DELPHI6+ADO+ORACLE,如果换成BDE/DBEXPRESS+ORALCE,就没有这个问题.
      

  2.   

    没遇到过,
    就算是Bug也是MDAC和Oracle的BUG
    最好用最新版的MDAC
      

  3.   

    欢迎大家参与,TIntegerField和TBCDField的问题。
      

  4.   

    你用的是DELPHI6+ADO+ORACLE吗?我做过很多次的实验,BDE/DBEXPRESS+ORACLE没有问题
    ADO+SQL SERVER/ACCESS 也没有问题,
    就是ADO + ORACLE就会出这种问题.
      

  5.   

    adoquery1.Recordset.Fields[2].Value   这样就能取出负数
    clientdataset1.Fields[2].Value   这样就取不出负数。必须是ADO+ORACLE
    说说你们用的是什么版本的DELPHI
      

  6.   

    D6+ADO+Oracle8,9,10
    没有发现问题不过用ADO的低版本,和Oracle确实存在一些不兼容问题
    用MDAC 2.8试试,驱动用Oracle的驱动,不要用MS的
      

  7.   

    我今天上午刚装的MDAC 2。8,还是一样。我发现我以前的程序也存在这个问题,取不出负数来。
    “驱动用Oracle的驱动,不要用MS的”这是什么意思?这么写不行吗?
    Provider=MSDAORA.1;Password=info;User ID=hcinfo;Data Source=hcinfo
      

  8.   

    ADOQUERY1中把整型的字段强制定义为TIntegerField,而不是TBCDField。
      

  9.   

    提供程序“Oracle Provider for OLE DB”是Oracle的驱动
    “Microsoft OLE DB Provider for Oracle”是MS的驱动
      

  10.   

    我改了Provider=OraOLEDB.Oracle.1;Password=info;Persist Security Info=True;User ID=hcinfo;Data Source=hcinfo;Extended Properties=""
    还是不能正确地取出负的整数。
      

  11.   

    但是如果改成dbExpress,马上就能取出负数。
      

  12.   

    我刚才又做了实验,如果把字段类型设为number(10,0)就可以取出负数,如果设为number(9,0)就只能取出正数。如果宽度更小的话也取不出负数来。
    但是如果设为number(*)的话,就可以取出负数来。
      

  13.   

    这个问题已经基本解决了,如果是ADO+ORALCE,那么整型的类型必须是number(10,0),精度要在10以上,或者是number(*),这样就可以取出负数来,如果是这个类型的字段,那么adoquery中的字段类型就是TBCDField,如果把字段类型设为number(9,0)或者精度更低的话,在adoquery中的字段类型就是TIntegerField,如果字段类型是TIntegerField,那么就取不出来负数了。不过有另外一种情况,如果字段类型设为number(9,0),如果使用DBExppress连接数据库,那么SQLQuery1中的字段类型也被自动地设为TBCDField,这恐怕就是就是为什么使用DBExpress可以读取负数而使用ADO就无法读取负数的一个很重要的原因吧。我想这可能是delphi里面的一个bug,如果大家有兴趣的话,可以做一个实验。
      

  14.   

    楼主的问题我在几年前就碰到了,当时也是改精度才可以的,它只是不出现符号‘-’,数值还是负数,保存到数据库中也是负,这跟是oracle还是sqlserver没有关系,这真可能是delphi 用ado来的一个bug,一直都还没有解决这个问题。
      

  15.   

    把对应ADO控件的 EnableBCD 设置为 false 试试;