Recordset读取Oracle浮点型数据的问题

Randy002 2005-02-05 05:26:52
在Oracle中有这样一个表:
(
a varchar2(16),
b date,
c float(126),
d float(126)
)

同时,有用VB6写的这一段程序:
sqlstr="select a, b, c, c-d from tablename"
set rec=datasource.openrecordset(sqlstr, dbOpenSnapshot, 64)

每个字段都是非空的,且 c-d 的范围在0到0.02之间,

但我看到的是: rec(2)=c都没有问题,rec(3)全部都显示为0。

不知道问题在哪里? 请高手们赶快来帮忙~~~
...全文
300 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Randy002 2005-02-16
缩小精度是不行的了,用户的需求是那样的,没办法~~

我就另外建了一个视图,加了一个字段,等于c-d。 楼上说的也是一个将计就计的办法。


疑惑还是那个:“为什么直接抓一个字段就没问题,抓运算后的字段就会被取整呢?”
回复
cqq_chen 2005-02-15
为什么不取出来后到记录集中再相减呢?
回复
Tiger_Zhao 2005-02-15
一般 Double 类型为 8 个字节,你看能不能将精度缩小点,或者用固定小数的数值类型
回复
Randy002 2005-02-06
to Tiger_Zhao(VB老鸟):

谢谢!
float(126)精度是很大了,要22个字节~~ 不过为什么直接抓一个字段就没问题,抓运算后的字段就要取整呢?

在Oracle强制类型转换,我也不太了解,不过将计就计,我干脆加了一个字段,用trigger让它等于c-d,然后直接抓这个字段,问题已经解决了~~

不过我暂时还不想结帖,还欢迎大家来赐教类型转化的方法!
回复
Tiger_Zhao 2005-02-06
oracle 中的 float(126) 具体是什么精度?可能在无法自动转换为 ado 响应的浮动类型,你把精度降下来试试
回复
pikachu8guan 2005-02-06
你查一下ORACLE的SQL帮助,看看有没有转换成浮点数的函数,我这没有ORACLE环境,测试不了!!
是啊 楼主看下 是不是浮点的问题啊
回复
Randy002 2005-02-06
楼上想表达什么意思啊?~~
回复
tomuno 2005-02-06
select a, b, c-d,c from tablename


select a, b, c from tablename
select (c-d) from tablename
回复
Randy002 2005-02-06
呵呵,不需要改用了,我用的就是ADODB的Recordset

dim rec as ADODB.Recordset
我就是rec(0), rec(1) ...这样的方式读的数据, 可得到的是一列“0”
回复
viena 2005-02-06
楼主改用ADODB的Recordset打开试一下呢
回复
viena 2005-02-06
//VB的问题
VB本身没有什么能力的,都是使用外部的东西,VB做数据库一般是用ADODB的,是比较高层的对象,封装了具体的OLEDB的具体操作,具体操作由OLEDB提供程序(或者绕个弯通过ODBC驱动程序)完成,而OLEDB提供程序、ODBC驱动程序一般是由数据库厂商提供的,Oracle方面用得不多,具体也不太了解

//set rec=datasource.openrecordset(sqlstr, dbOpenSnapshot, 64)
sorry,没看懂妳这一句是虾米意思?
是用什么打开的呢?是ADODB吗?
回复
Randy002 2005-02-06
哈哈,回复好快,是不是今天大家都没心思上班呢~~ 可惜我还要工作到年三十的17:30~

再次谢谢各位的关心,其实我之所以在这里问问题,就是我认为很明确是VB的问题,而不是Oracle的问题,

不过我还是在SQL语句中用了各位提到的强制类型转换,发现的结果让我更确定是VB的问题了:

不管是c, d, 还c-d, 只要用了round函数处理后,到了VB里面都变成取整后的值了,看来round函数也跟那些运算符一样麻烦~~

呵呵,还请各位再帮忙想想哦~~ 多谢了!
回复
viena 2005-02-06
ROUND(c-d,2)试一下
回复
射天狼 2005-02-06
你查一下ORACLE的SQL帮助,看看有没有转换成浮点数的函数,我这没有ORACLE环境,测试不了!!
回复
Tiger_Zhao 2005-02-06
在 SQL 指定列类型,如果是 SQL Server,可以写成
select a, b, c, CASE(c-d AS float(126)) from tablename
Oracle 中也肯定有响应的类型转换函数/语句
回复
Randy002 2005-02-06
谢谢各位,但是问题还没有任何突破!~~

to viena(维也纳nn-实心木头人):

说是Oracle的问题,倒不如说是VB的问题,我用SQL Navigator读出来的数据都是准确的!


to palmkey(原水):

可能是我说的不够明确,我说c-d的范围在0到0.02之间,意思是 0<c-d<0.02。


to Leftie(左手,为人民币服务):

谢谢你的提醒,我发现SQL语句里面只要出现运算符,则运算结果都会被取整,哪怕结果是0.999都会变成0,但是1.001就变成1了。只是不知道为什么会这样? 为什么直接抓c和d都没有取整呢?
回复
饮水需思源 2005-02-05
将c、d与c和d之差都列出来看看:
sqlstr="select a, b, c,d, c-d from tablename"
回复
palmkey 2005-02-05
是否c-d本来都为0,应该与数据库或程序无关
回复
viena 2005-02-05
是Oracle的问题吧~
回复
发帖

1183

社区成员

VB 数据库(包含打印,安装,报表)
申请成为版主
帖子事件
创建了帖子
2005-02-05 05:26
社区公告
暂无公告