应该是DELPHI的一个BUG,ADO+ORACLE,无法正确读取负的整数

sywxy 2005-08-07 05:20:28
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的正确的数值,但是这样操作是比较麻烦的,不知道大家有没有什么好的办法.
...全文
202 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzh65414 2006-05-25
  • 打赏
  • 举报
回复
不会吧。我回去试试先。^-^
dolphin2001 2006-05-24
  • 打赏
  • 举报
回复
把对应ADO控件的 EnableBCD 设置为 false 试试;
postfxj 2006-05-24
  • 打赏
  • 举报
回复
楼主的问题我在几年前就碰到了,当时也是改精度才可以的,它只是不出现符号‘-’,数值还是负数,保存到数据库中也是负,这跟是oracle还是sqlserver没有关系,这真可能是delphi 用ado来的一个bug,一直都还没有解决这个问题。
sdzeng 2005-08-08
  • 打赏
  • 举报
回复
D6+ADO+Oracle8,9,10
没有发现问题

不过用ADO的低版本,和Oracle确实存在一些不兼容问题
用MDAC 2.8试试,驱动用Oracle的驱动,不要用MS的

sywxy 2005-08-08
  • 打赏
  • 举报
回复
adoquery1.Recordset.Fields[2].Value 这样就能取出负数
clientdataset1.Fields[2].Value 这样就取不出负数。

必须是ADO+ORACLE
说说你们用的是什么版本的DELPHI
hqhhh 2005-08-08
  • 打赏
  • 举报
回复
没碰到过这样的问题!应该不可能
但楼主说的也应该没错!呵呵矛盾!
lybdata 2005-08-08
  • 打赏
  • 举报
回复
没有问题,我经常要在数据库里取数没有出现过你说的问题
sywxy 2005-08-08
  • 打赏
  • 举报
回复
你用的是DELPHI6+ADO+ORACLE吗?

我做过很多次的实验,BDE/DBEXPRESS+ORACLE没有问题
ADO+SQL SERVER/ACCESS 也没有问题,
就是ADO + ORACLE就会出这种问题.
sywxy 2005-08-08
  • 打赏
  • 举报
回复
这个问题已经基本解决了,如果是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,如果大家有兴趣的话,可以做一个实验。
sywxy 2005-08-08
  • 打赏
  • 举报
回复
我刚才又做了实验,如果把字段类型设为number(10,0)就可以取出负数,如果设为number(9,0)就只能取出正数。如果宽度更小的话也取不出负数来。
但是如果设为number(*)的话,就可以取出负数来。
sdzeng 2005-08-08
  • 打赏
  • 举报
回复
建表脚本贴出来,我试试
sywxy 2005-08-08
  • 打赏
  • 举报
回复
我的同事在他的机器上操作,也读不出来负数。
sywxy 2005-08-08
  • 打赏
  • 举报
回复
但是如果改成dbExpress,马上就能取出负数。
sywxy 2005-08-08
  • 打赏
  • 举报
回复
我改了Provider=OraOLEDB.Oracle.1;Password=info;Persist Security Info=True;User ID=hcinfo;Data Source=hcinfo;Extended Properties=""
还是不能正确地取出负的整数。
sdzeng 2005-08-08
  • 打赏
  • 举报
回复
提供程序“Oracle Provider for OLE DB”是Oracle的驱动
“Microsoft OLE DB Provider for Oracle”是MS的驱动
sywxy 2005-08-08
  • 打赏
  • 举报
回复
ADOQUERY1中把整型的字段强制定义为TIntegerField,而不是TBCDField。
sywxy 2005-08-08
  • 打赏
  • 举报
回复
我今天上午刚装的MDAC 2。8,还是一样。我发现我以前的程序也存在这个问题,取不出负数来。
“驱动用Oracle的驱动,不要用MS的”这是什么意思?

这么写不行吗?
Provider=MSDAORA.1;Password=info;User ID=hcinfo;Data Source=hcinfo
GARNETT2183 2005-08-07
  • 打赏
  • 举报
回复
试了..也没问题啊..
sywxy 2005-08-07
  • 打赏
  • 举报
回复
欢迎大家参与,TIntegerField和TBCDField的问题。
sdzeng 2005-08-07
  • 打赏
  • 举报
回复
没遇到过,
就算是Bug也是MDAC和Oracle的BUG
最好用最新版的MDAC
加载更多回复(3)

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧