关于使用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问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
SQL中NUMERIC和DECIMAL的区别
javaWeb 开发流程:首先我们从网站的架构谈起。一般来说,我们将网站分为前端和后端。前端主要负责页面的展示,后端则是业务逻辑的实现。由于html5的兴起,前端领域已经越来越火热,前端技术发展极快。。
mysql修改numberic类型自动转换成decimal
希望知道的小伙伴,评论下方。谢谢!
关于数据库使用numeric(18,2) ,java后台使用double会出现金额显示问题解决方案。
numeric(18,2) //数据库字段类型 java.math.BigDecimal //Java后台要使用BigDecimal类型
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...
Hive_Hive 中数据类型介绍
参考的文章:Hive 数据类型https://edu.csdn.net/promotion_activity?id=3&amp;amp;utm_source=618qzttHive 学习之Hive 数据类型https://blog.csdn.net/skywalker_only/article/details/27547515Hive 中数据类型主要分为以下几种类型数值类型字符串类型日期/时间类型其他类型...
第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
decimal这个数据类型的用法,保证你看懂
decimal这个数据类型的用法,保证你看懂
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 选项为 ...
将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
将int字段改为decimal类型后出现1264 Out of range value的问题分析和处理之二
有开发同事在生产环境对某个表将int字段改成decimal(10,4)后,提示 1264 Out of range value报错,且原来值为负数,更改字段类型后,全部变为0,咨询dba这个为什么会报错,对数据有什么影响? 我收到这问题后,第一反应就是由于字段类型转换,长度不够发生了数据溢出。 于是,下面对模拟该问题进行测试: 1.建测试表 CREATE TABLE `zeng1` (
更改数据库表中有数据的字段类型NUMERIC(18,2)为NUMERIC(18,6)
前段时间遇到一个问题,需要更改一个表的带有数据的字段类型,需要将NUMERIC(18,2)为NUMERIC(18,6) 【1】oracel的写法为: --第一步:把原字段换个名字 alter table wk_emp_charge_work rename column oper_time to oper_time1; --第二步:在表中添加一个原字段名字oper_time,并把类型定义...
MS SQL 数据类型相对应名称
 文本 nvarchar(n) 备注 ntext 数字(长整型) int 数字(整型) smallint 数字(单精度) real 数字(双精度) float 数字(字节) tinyint 货币 money(1)char、varchar、text和nchar、nvarchar、ntext char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变
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数据类型最大的区别是
OTL 连接数据库,获取字段列表属性
获取表 字段列表 方法一:   OTL stream class 介绍       otl_strean 类 具体的实现了OTL 流的概念。任何的SQL语句、SQL语句块和存储过程都能通过otl_stream进行处理。      传统的数据库API处理SQL语句的时候,需要绑定变量与占位符。所以,开发者需要声明主数组在程序中So, the developer has to declar
Spark SQL和DataFrames支持的数据格式
Spark SQL和DataFrames支持的数据格式如下:数值类型 ByteType: 代表1字节有符号整数. 数值范围: -128 到 127. ShortType: 代表2字节有符号整数. 数值范围: -32768 到 32767. IntegerType: 代表4字节有符号整数. 数值范围: -2147483648 t到 2147483647. LongType: 代表8字节有符号整
Python—数据类型之decimal类型
十进制类型 要创建Decimals,必须先导入decimal模块 decimal的精度可以由我们自己指定 函数 decimal.Decimal(x) #x可以是一个整数或字符串,但不能是浮点数 &gt;&gt;&gt;import decimal &gt;&gt;&gt;a = decimal.Decima...
decimal 数据类型
在C#里decimal表示 128 位数据类型。double相比,decimal 类型具有更高的精度和更小的范围,它适合于财务和货币计算。
mysql 数据类型 (最大值 和 最小值)
1、整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节  范围(-128~127) smallint(m) 2个字节  范围(-32768~32767) mediumint(m) 3个字节  范围(-8388608~8388607) int(m) 4个字节  范围(-2147483648~21474836
[Python标准库]decimal——定点数和浮点数的数学运算
[Python标准库]decimal——定点数和浮点数的数学运算         作用:使用定点数和浮点数的小数运算。         Python 版本:2.4 及以后版本         decimal 模块实现了定点和浮点算术运算符,使用的是大多数人所熟悉的模型,而不是程序员熟悉的模型,即大多数计算机硬件实现的 IEEE 浮点数运算。Decimal 实例可以准确地表示任何数,对其上取整
mysql数据库内NUMERIC系列数据类型介绍
tinyint(M): 很小的整数。 占用字节:1。 带符号的范围是-128到127。无符号的范围是0到255。 适用于很小的整数值。 宽度M:4。 smallint(M): 小的整数。 占用字节:2。 带符号的范围是-32768到32767。无符号的范围是0到65535。 适用于小的整数。 宽度M:6。 ...
FLOAT,DECIMAL,NUMERIC类型的数据累加问题???
一个简单的累加rna=a+rs("积分")rnresponse.write arn分别用上述三种类型的数据(积分),但只有FLOAT型的可以累加出结果,其余两个类型的侧无结果,a还是原来值,非常奇怪,请帮忙解决rn
odbc 数据库批量插入操作
使用odbc批量插入10W条数据,与update作对比,速度明显提升,将近10倍。
VS 2010 C++ 用ODBC方式读取数据库
环境:VS2010 C++ 用ODBC方式连接数据库,方法简单适合入门学习 数据库用的ACCESS
mysql字段类型decimal和int类型运算,结果精度问题
mysql数据库的decimal和int类型运算后不会损失精度以下为数据库表结构: 以下为表内容: 测试结果:
VBA:Double类型与Decimal类型
Sub DataType() For i = 0 To 100 t1 = t1 + 0.1 t2 = t2 + CDec(0.1) Debug.Print "Double=" & t1 & " Decimal=" & t2 Next End Sub 结果: Double=.1 Decimal=.1 Double=.2
mysql 价格类字段的类型选择double decimal
一、decimal二、double 只有保存整数数字
ASP.Net执行存储过程,SqlDbType.Decimal作为输出参数,没有小数位
存储过程中需要输出参数值如下 @AchieveBonus decimal(18,2) output 代码中也是用decimal接收,需特别注意的是:必须要设置输出参数的长度及小数位,即要单独设置数据库中的18和2。 public decimal GetAchievementBonusByUId() { SqlParameter[] param = { new ...
使用ODBC API 连接数据库
DBC API的体系结构  使用ODBC API开发数据库应用程序的一般步骤  使用函数SQLAllocHandle分配句柄  使用函数SQLConnect、SQLDriverConnect、SQLBrowseConnect连接数据源 
Win32 API 和 ODBC 访问数据库一
准备用Win32 API和ODBC来访问数据库; 代码如下; /*------------------------------------------------------------ win32, ODBC, by bobo, 2018-09-09 ------------------------------------------------------------*/...
CDatabase::Open() 和 CDatabase::OpenEx()的区别
CDatabase::Openvirtual BOOL Open(LPCTSTR lpszDSN,                  BOOL bExclusive = FALSE,                  BOOL bReadOnly = FALSE,                  LPCTSTR lpszConnect = _T("ODBC;"),                
Hive数据类型和使用注意事项详解
了解Hive数据类型 ,是Hive编程的基础。使用hive建表,首先要明白hive常用的数据类型有哪些,可以存储哪些类型的数据。其实Hive支持关系型数据库中的大多数基本数据类型,且同时支持关系型数据库中少见的3种集合数类型(STRUCT,MAP,ARRAY)。然而学习技术最好的方式之一就是去查看官方文档。 Hive关于数据类型官网地址:Hive官网关于数据类型的介绍 ...
decimal与numeric类型有什么区别?
看起来好象是一样的。
python odbc连接
通过odbc直接连接各种数据库,这是python2.5的版本
ODBC、JDBC和四种驱动类型
早期的数据库开发领域没有通用的应用程序编程接口,开发人员在使用不同数据库产品时,必须学习和使用厂商专用API,例如Oracle Call Interface、Microsoft Database Library等。针对业界对通用编程接口的需求,微软推出了ODBC(Open Database Connectivity)方案,并获得厂商和开发人员的认可。ODBC建立了一组规范,并提供了对数据库访问的标
数据类型映射
数据类型映射 这是表头 这是表头 这是表头 integer java.lang.Integer INTEGER long java.lang.Long BIGINT short java.lang.Short SMALLINT float java.lang.Float FLOAT double java.l
关于FLOAT8,decimal,NUMERIC类型字段的用法!
我以前用的字段是:FLOAT8 后来不合用。rn在各位大侠的建议下使用使用了,decimal,把FLOAT8全部转换为decimal(18,4)rn但是问题就来了:以前FLOAT8从数据库中读到程序里直接可以加减乘除,现在decimal(18,4)读到程序就不可以直接加减乘除了!rn我用的是ASP,用IsNumeric 函数测试从数据库中读出来的decimal(18,4)数据,发现不是数据类型!rn再用VarType 函数一看,是 vbDecimal 14 十进制值 。rn但是可以在程序里直接加减乘除的数据类型好像是:rnvbInteger 2 整数 rnvbLong 3 长整数 rnvbSingle 4 单精度浮点数 rnvbDouble 5 双精度浮点数 rn我应该怎么办?rn
odbc方式读取数据库
odbc连接数据库,数据库的文件没有上传。可能会有问题
php中变量的数据类型转换
php中变量的数据类型转换        在php中,当遇到不同类型数据进行混合运算时,php执行引擎会很智能将混合运算转为同一类型进行运算。有时我们自己需要将一些变量强制转为其他数据类型,也可以通过php中提供的一些机制和函数来实现。         变量类型转换:变量类型转换分为 自动转换和强制转换         自动转换:在php中自动转换常常发生在不同数据类型数据的混合运算中。在自
mybatis常用jdbcType数据类型
  MyBatis 通过包含的jdbcType类型 BIT         FLOAT      CHAR           TIMESTAMP       OTHER       UNDEFINEDTINYINT     REAL       VARCHAR        BINARY          BLOB        NVARCHARSMALLINT    DOUBLE   ...