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。

不知道问题在哪里? 请高手们赶快来帮忙~~~
...全文
382 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
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的问题吧~

1,217

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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