VB6中ADODB.Recordset读取DB2数据丢失小数位问题求助
问题:VB6通过ODBC从DB2获取数据时数值被向下取整
我在VB6中通过ODBC连接DB2数据库,连接及配置均正常,但返回的Recordset字段值被向下取整为整数——例如数据库列值为0.99时,读取后返回0。相同查询在Microsoft Query中可得到带小数的正确结果。
相关代码如下:
Set objCommand As New ADODB.Command Set recordSet As New ADODB.Recordset sqlQuery= "Select f2scop Price from database.mpline where ibsuno='" & Order & "' order by ibpuno, ibpnli" With objCommand .ActiveConnection = ConnectDB2 .CommandType = adCmdText .CommandText = sqlQuery End With With recordSet .CursorType = adOpenStatic .CursorLocation = adUseClient .LockType = adLockOptimistic .Open objCommand End With myVariable.value = recordSet("Price")
调试时,recordSet("Price").OriginalValue同样返回取整后的值;但recordSet("Price").precision、.numericscale及.type均返回符合小数字段的预期结果。以下是几种可行的解决方向:
解决方法
1. SQL查询层面强制转换字段类型
在查询语句中显式将字段转换为带小数的数值类型,避免驱动自动转换:
Select CAST(f2scop AS DECIMAL(10,2)) Price from database.mpline where ibsuno='" & Order & "' order by ibpuno, ibpnli
根据数据库中f2scop字段的实际精度调整DECIMAL的参数(比如DECIMAL(15,4)),确保返回明确的小数类型。
2. 调整Recordset游标位置
将游标位置从客户端改为服务器端,让DB2直接返回原始数值,避免本地游标类型转换误差:
With recordSet .CursorType = adOpenStatic .CursorLocation = adUseServer ' 替换原adUseClient .LockType = adLockOptimistic .Open objCommand End With
3. 检查ODBC驱动配置
打开ODBC数据源管理器,找到对应的DB2数据源配置:
- 查找是否有数值自动取整相关的勾选选项,直接取消;
- 升级DB2 ODBC驱动到最新版本,旧版本可能存在类型映射bug;
- 在高级设置中调整数值精度参数,匹配数据库字段的实际精度。
4. 确保变量类型支持小数
确认接收数值的myVariable或中转变量为浮点/货币类型(如Double、Currency),避免整数类型自动截断小数:
Dim dPrice As Double dPrice = recordSet("Price").Value myVariable.value = dPrice
内容的提问来源于stack exchange,提问作者Filipe Lopes
相关产品推荐
相关产品推荐

