Получая реальный тип данных с использованием ODBC, данные преобразуются в более высокую точность - PullRequest
0 голосов
/ 28 августа 2018

У меня есть таблица с реальным столбцом типа данных на сервере sql.

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);

при выполнении select f_real from Table_1; с использованием ODBC API (из приложения 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 - это typedef для void *, а SQLINTEGER - это typedef для long. Я получаю данные, выполнив ниже

double data = *(double *)m_pColValInfo[0].pValue;

Я использую драйвер odbc 13 для связи с базой данных. Поскольку драйвер заботится о преобразовании данных из типа sql в собственный тип, который указан в вызове ODBC SQLBindCol, я хочу знать, как я получаю 40003.160156250000, когда у меня есть 40003.16 в моей базе данных. Я изменил точность и масштаб столбца базы данных на десятичное (16,2), чтобы понять, имеет ли это какое-то значение, я не вижу никакого различия.

enter image description here

Может кто-нибудь, пожалуйста, сообщите мне, где происходит неправильное преобразование.

...