使用ODBC获取真实的数据类型,将数据转换为更高的精度

时间:2018-08-28 10:45:45

标签: c++ sql-server odbc double real-datatype

我在SQL Server中有一个具有真实数据类型列的表。

CREATE TABLE Table_1(f_int int, f_string nchar(10), f_real real); 
INSERT INTO Table_1 (f_int, f_string, f_real) VALUES (42000000, 'myString2', 40003.16);

当我使用ODBC API执行select f_real from Table_1;时(来自c ++应用程序) 我得到的值是40003.160156250000,而不是40003.16

我已将结果列绑定如下。

struct ColValInfo
{
    ColValInfo(){
        pValue = NULL;
    }
    SQLPOINTER pValue;
    SQLINTEGER StrLen_or_Ind;
};
ColValInfo* m_pColValInfo;
m_pColValInfo = new ColValInfo[numColumns];
m_pColValInfo[0].pValue = (SQLPOINTER) new char[50];
SQLBindCol(hstmt, 1, SQL_C_DOUBLE, m_pColValInfo[0].pValue,
                siz, &(m_pColValInfo[0].StrLen_or_Ind));

注意:SQLPOINTER是void *的typedef,而SQLINTEGER是long的typedef。 我正在通过以下

获取数据
double data = *(double *)m_pColValInfo[0].pValue;

我正在使用odbc驱动程序13与数据库进行通信。由于驱动程序负责将数据从sql类型转换为SQLBindCol ODBC调用中指定的本机类型,因此我想知道当数据库中有40003.16时如何获得40003.160156250000。 我已将数据库列的精度和小数位数更改为十进制(16,2),以查看是否有任何区别,我看不出有什么区别。

enter image description here

请让我知道转换出错了。

0 个答案:

没有答案