关于使用ODBC API读取Decimal或者Numeric类型数据

我想通过odbc接口连接sql server服务器,并获取decimal或numeric类型数据。在执行了SQLExecDirect之后,给描述符句柄的SQL_DESC_PRECISION和SQL_DESC_SCALE字段设置了合适的值,再通过SQLGetData获取数据,发现只能得到整数部分,不能得到小数部分。十分困惑。希望得到大家的帮助。万分感谢!
我参考的代码为: http://support.microsoft.com/kb/222831
主要代码:

    retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);

    retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);

    retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);

    retcode = SQLConnect(hdbc1, "mssql-sa",SQL_NTS,"sa",SQL_NTS,"111111",SQL_NTS);

    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);

    //numeric_test表中只有1列,类型为numeric(5.3)。示例:12.345
    retcode = SQLExecDirect(hstmt1,(UCHAR *)"select * from numeric_test",SQL_NTS);

    retcode = SQLBindCol(hstmt1,1,SQL_C_NUMERIC,&NumStr,19,&strlen1);

    retcode = SQLGetStmtAttr(hstmt1, SQL_ATTR_APP_ROW_DESC,&hdesc, 0, NULL);

    retcode = SQLSetDescField (hdesc,1,SQL_DESC_TYPE,(void *)SQL_C_NUMERIC,0);

    retcode = SQLSetDescField (hdesc,1,SQL_DESC_PRECISION,(void *)5,0);

    retcode = SQLSetDescField (hdesc,1,SQL_DESC_SCALE,(void *)3,0);

    while((retcode =SQLFetch(hstmt1)) != SQL_NO_DATA)
    {
        //retcode = SQLGetData(hstmt1, 1, SQL_ARD_TYPE, &NumStr, 19, &a) ; 

        printf("precision:%d, scale:%d, sign:%d\n", NumStr.precision, NumStr.scale, NumStr.sign);
        for (i = 0; i < 16; i++) {
            printf("val[%d]:%d\n", i, NumStr.val[i]);
    }

存储数据的数据结构如下:

 #define SQL_MAX_NUMERIC_LEN        16
typedef struct tagSQL_NUMERIC_STRUCT
{
    SQLCHAR        precision;
    SQLSCHAR    scale;
    SQLCHAR        sign;    /* 1=pos 0=neg */
    SQLCHAR        val[SQL_MAX_NUMERIC_LEN];
} SQL_NUMERIC_STRUCT;

打印为:
precision:5, scale:0, sign:1
val[0]:12
val[1]:0
val[2]:0
val[3]:0
val[4]:0
val[5]:0
val[6]:0
val[7]:0
val[8]:0
val[9]:0
val[10]:0
val[11]:0
val[12]:0
val[13]:0
val[14]:0
val[15]:0
相当于我设置描述符句柄的SQL_DESC_SCAL字段一点用都没有。但通过SQLGetDescField查看SQL_DESC_SCALE字段的值确实为3,跟我设置的是一致的。
ps:所有函数调用都成功了。

1

1个回答

已确定原因。不是ODBC的用法有问题,而是freetds驱动不支持通过设置precision和scale两个描述符字段,指定范围和小数位数获取数据的机制。可以设置,但没有生效。

查看代码,手动修改了最新版freetds驱动源码,已解决该问题。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于mysql数据库的数据类型numeric和decimal
转自:http://zhidao.baidu.com/question/40565659.html decimal(numeric ) 同义,用于精确存储数值 decimal 数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边。decimal 数据类型存储了一个准确(精确)的数字表达法;不存储值的近似值。 定义 decimal 的列、变量和参数的两种特性如下:
Mysql中NUMERIC和DECIMAL类型区别比较(已测5.6)
 原文地址:http://www.111cn.net/database/mysql/55524.htm numeric与decimal表示的数据类型是有的区别的,主要在精确度上,更详细的确要看下面对比与实例比较。 decimal(numeric ) 同义,用于精确存储数值 。 decimal 数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边。deci
mysql修改numberic类型自动转换成decimal
希望知道的小伙伴,评论下方。谢谢!
ODBC3.0的数据类型列表
前言 要准备一些测试数据,写一些SQL来测试. 目标数据库支持的兼容数据库还挺多的。没发现有自带的表设计器, 这样就无法知道该数据库支持的SQL数据类型了. 找到了ODBC3.0支持的数据类型, 在informix中看到的SQL数据类型都在。 那就按照ODBC3.0标准中规定的数据类型来测试。 到了具体的数据库,还会自定义一些数据类型(数量不多). 这些数据类型不通用。 ...
MySQL decimal、numeric数据类型介绍
MySQL decimal、numeric数据类型 DECIMAL(M, D) 例 如:salary DECIMAL(5,2)    在这个例子中,5 (精度(precision)) 代表重要的十进制数字的数目,2 (数据范围(scale)) 代表在小数点后的数字位数。在这种情况下,因此,salary 列可以存储的值范围是从 -999.99 到 999.99。(即M代表总位数,D代表
SQL中NUMERIC和DECIMAL的区别
javaWeb 开发流程:首先我们从网站的架构谈起。一般来说,我们将网站分为前端和后端。前端主要负责页面的展示,后端则是业务逻辑的实现。由于html5的兴起,前端领域已经越来越火热,前端技术发展极快。。
关于数据库使用numeric(18,2) ,java后台使用double会出现金额显示问题解决方案。
numeric(18,2) //数据库字段类型 java.math.BigDecimal //Java后台要使用BigDecimal类型
ODBC API开发教程
 ODBC API开发教程  作者:闻怡洋未得到作者允许请勿转载http://wyy.vchelp.net/ 目录第 1 章        介绍... 2第 2 章        ODBC API访问数据库... 22.1       ODBC简要介绍... 22.1.1        在没有ODBC以前...
小数类型的数字,数值类型转换[DECIMAL,NUMERIC,FLOAT,INT]
-- 小数类型的数字,数值类型转换 -- 不存在小数, 直接四舍五入 SELECT CONVERT(DECIMAL,390.50) -- 执行结果:391 -- 选择位数近似值【两位小数, 四舍五入】 SELECT CONVERT(NUMERIC(10,2),390.55688) -- 执行结果:390.56 SELECT CONVERT(FLOAT,390.55688) --
Mysql中NUMERIC和DECIMAL类型区别比较
decimal(numeric ) 同义,用于精确存储数值 。 decimal 数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边。decimal 数据类型存储了一个准确(精确)的数字表达法;不存储值的近似值。 定义 decimal 的列、变量和参数的两种特性如下: p 小数点左边和右边数字之和,不包括小数点。如 123.45,则 p=5,s=2。指定精度或对象能够控制的数字个...
sql Server中float、real、decimal(numeric)数据类型的区别
decimal 数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边。decimal 数据类型存储了一个准确(精确)的数字表达法;不存储值的近似值。 定义 decimal 的列、变量和参数的两种特性如下: · p 小数点左边和右边数字之和,不包括小数点。如 123.45,则 p=5,s=2。 指定精度或对象能够控制的数字个数。 · s 指定可
decimal(18,4)是什么意思
decimal(18,4)表示小数和整数加起来是18位,其中小数是4位。     传说中的decimal(numeric)     详情参见URL:http://www.chinaret.com/user/topic_view.aspx?id=e2fa4bee-d532-4317-8e95-055c59816473...
从数据类型 decimal 转换为 numeric 时出错
从数据类型 decimal 转换为 numeric 时出错。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.SqlClient.SqlException: 从数据类型 decimal 转换为 numeric 时出错。 源错误: 行 46:            { 行 47: 
关于MSSQL的decimal(numeric)、money、float的使用以及区别
decimal(numeric)、money、float(real) 都是MSSQL中的浮点类型的数据类型。 按存储的范围进行排序 float(real) decimal(numeric) money   在金额的存储上可以优先money,如果金额过大采用decimal(numeric),极端的情况(数据超大)使用float(real)   money与float不会自动默认小数点
Oracle 数值类型
本文只总结了几个oracle的数值类型,包括number极其子类型,现在先理解到这里,有需要的时候会继续补充。 Oracle的数值类型有int,number,float,decimal,numberic等。 NUMBER类型 定义 定义格式NUMBER (precision,scale) precision表示数字中的有效位(从左边第一个不为0的数算起,小数点和负号不计入有效位数
第5节--python数据类型--numeric
python数据类型 总体:numerics, sequences, mappings, classes, instances, exceptions Numeric Types: int (包含boolean), float, complex int: unlimited length; float: 实现用double in C, 可用 sys.float_info查看; complex: re
db2 中的DECIMAL 数字数据类型
使用形式:DECIMAL(p,s) DECIMAL是个十进制数; p是精度,表示这个十进制数的总位数,p应该小于32; s表示小数的位数。s应该小于等于p;如果未指定p是5,s是0;
postgresql数据类型对比说明
sql standard sqlserver postgresql postgresql description aliases bigint bigint bigint int8 signed eight-byte integer:有符号8字节整数     bigserial serial8 autoincrementing eight-by
sqlalchemy常见数据类型及配置
类型名称 python类型 描述     Integer int 常规整形,通常为32位     SmallInteger int 短整形,通常为16位     BigInteger int或long 精度不受限整形     Float float 浮点数    ...
关于 双精度字段类型导入sqlserver转为numeric类型报错原因及解决方案
1.背景:     在用arcmap导入shp数据到数据库的时候,发布服务后服务查询400,querycode 失败,日志查看报错截图入下: 2.原因: 经排除并不是数据库环境问题而是关于数据转换的原因,     默认情况下,在将数字转换为较低精度和小数位数的 decimal 或 numeric 值时,SQL Server 使用舍入法。然而,如果 SET ARITHABORT 选项为 ...
MYSQL数据库 的 decimal 字段类型
MYSQL数据库 的 decimal 字段类型
ibatis的数据库值为空的错误(number数据类型)
 Ibatis2当数据库里数据类型为NUMBER时候,数据为空,对应PO对象数据类型为int,long数值类型的时候,会报错误。错误为
Numeric 数据类型
SQL 数据类型 Numeric 数据类型功能 存储数值数据。注意  NUMERIC 和 DECIMAL 数据类型,以及各种 INTEGER 数据类型,有时被称为精确数值数据类型,与之相对的是近似数值数据类型 FLOAT、DOUBLE 和 REAL。 精确数值数据类型是那些可以指定精度值和小数位数值的数据类型,而近似数值数据类型是以预定义方式
PostgreSQL 字段类型转换
语法 ALTER TABLE 表名 ALTER COLUMN 列名 TYPE 类型 USING 列名::类型 示例 在public库中有表A,A表中有列B varchar,现在要列B的类型转换成float类型 ALTER TABLE "public".A ALTER COLUMN B TYPE numeric(10,2) USING B::numeric(10,2)
将int字段改为decimal类型时出现1264 Out of range value的问题分析和处理
有开发同事在验证环境对某个表将int字段改成decimal(10,4)后,提示 1264 Out of range value报错,咨询dba这个为什么会报错,对数据有什么影响? 我收到这问题后,第一反应就是由于字段类型转换,长度不够发生了数据溢出。 于是,下面对模拟该问题进行测试: 1.建测试表 CREATE TABLE `zeng` (   `_id` int(11) NOT NUL
mybatis常用jdbcType数据类型 对应java类型
MyBatis 通过包含的jdbcType类型 BIT         FLOAT      CHAR           TIMESTAMP       OTHER       UNDEFINED TINYINT     REAL       VARCHAR        BINARY          BLOB        NVARCHAR SMALLINT    DOUBLE
ODBC数据类型定义 | from web
转载自:http://www.cppblog.com/prayer/archive/2009/04/02/78719.html   在使用ODBC开发时一个重要的问题就是数据转换的问题,在ODBC中存在下面的几类数据: l          数据库中SQL语言表达数据的类型 l          ODBC中表达数据的类型 l          C语言中表达数据的类型 在程序运行过程
ODBC接口规范
第1章              ODBC API 基础... 1 1.1             ODBC API句柄... 1 1.1.1         环境句柄... 1 1.1.2         连接句柄... 1 1.1.3         语句句柄... 1 1.2             ODBC数据类型... 2 1.2.1         SQL数据
Access 与SQL数据类型
Access 数据类型与 MS SQL 数据类型相对应名称文本 nvarchar(n) 备注 ntext 数字(长整型) int 数字(整型) smallint 数字(单精度) real 数字(双精度) float 数字(字节) tinyint 货币 m (1)char、varchar、text和nchar、nvarchar、ntextchar和varchar的长度都在1到8000之间,它们的区别
postgresql数字类型
postgresql的数据类型很多,也可以使用create type命令创建自定义数据类型,但常用的数据类型是以下三种: l  数字数据类型 l  字符串数据类型 l  日期/时间数据类型   数字数据类型 数字数据类型用于指定表中的数字数据,详情如下表所示: 名称 描述 存储大小 范围 smallint
MySql 数据类型——decimal详解
1.首先,对于精度比较高的东西,比如money,我会用decimal类型,不会考虑float,double,因为他们容易产生误差,numeric和decimal同义,numeric将自动转成decimal。 DECIMAL从MySQL 5.1引入,列的声明语法是DECIMAL(M,D)。在MySQL 5.1中,参量的取值范围如下: ·M是数字的最大数(精度)。其范围为1~65(在较旧的
ODBCAPI中对时间参数的绑定
    在对日期时间类型的字段进行绑定时,如果要使插入数据库中的时间的精度能够达到秒的话,那么需要按照如下语句进行://将SQLBindParameter函数中的第6个和第7个参数改为21和1,确定时间类型的精度SDWORD cbTime = 0;SQL_TIMESTAMP_STRUCT* pTimeType = new SQL_TIMESTAMP_STRUCT;pTimeType->year =
sqlite字段类型
改了点东西,因为想着要把项目优化,但是每条数据如果都存到单一数据库中,会造成以后的数据越来越大,怎么办?于是我想到了,可以考虑将单类数据存储到sqlite中,既可以备份,又可以用作缓存和其他作用。 所以就想到了sqlite的一些特性,当然,花了大量的时间测试代码,即,一份代码自动生成不同的数据库,可以自由控制读取哪个库哪个表。基于YII而已。写的有点挫,但现在这样的好处是可以不改动原有任何一
MySQL中的float和decimal类型有什么区别
decimal 类型可以精确地表示非常大或非常精确的小数。大至 1028(正或负)以及有效位数多达 28 位的数字可以作为 decimal类型存储而不失其精确性。该类型对于必须避免舍入错误的应用程序(如记账)很有用。float是浮点数,不能指定小数位。 decimal是精确数,可以指定精度。 对mysql 5来说 decimal(p,s)中p最大为65,S最大为30 decimal数据类型最多
sql server 数据类型numeric()等的用法!
1,数据类型 numeric(19,4),19 代表 长度为19位的数,4代表小数的精度为4,保留4位小数 2,bit:只能是0,1,空值 3,int范围:从-2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 。 4,char范围:此数据类型的列宽最大为8000 个字符 。 5,varchar(50)范围:它与char数据类型最大的区别是
Hive 0.13 数据类型
hive支持的数据类型路下 数值类型 Numeric Types TINYINT (1字节,数据范围: -128 to 127) SMALLINT (2字节,数据范围: -32,768 to 32,767) INT (4字节,数据范围:-2,147,483,648 to 2,147,483,647) BIGINT (8字节,数据范围: -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807) FLOAT (4字节, 单精度浮点数) DOUBLE (8字
ADO 读取DECIMAL类型字段的值
用ADO操作数据时,经常要读取DECIMAL类型的数据值,今天在这里写个笔记。_variant_t vt;vt =r->GetCollect("rowid"); dbRowID = vt.decVal.Lo32; dbRowID *= (vt.decVal.sign == 128)? -1 : 1; dbRowID /= pow(10.00, vt.decVal.scale);
Mysql中的数据类型对应于Java中什么数据类型
java mysql 数据类型对照 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N CHAR java.lang.String 1   BLOB L+
ODBC获取记录记录数
//ODBC 的 CRecordSet 提供了一个函数GetRecordCount 用于返回记录条数 //但是MSDN上有这样的说明 /*The record count is maintained as a "high water mark," the highest-numbered record yet seen as the user moves through the records
sqlserver 与 java数据类型对应
编号 数据库类型 JDBC类型 JDBC索引 描述 1 int java.lang.Integer 4   2 varchar java.lang.String 12   3 char java.lang.String 1   4 nchar java.lang.String 1   5 nvarchar
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 关于大数据培训 关于云计算