У меня есть таблица с реальным столбцом типа данных на сервере 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), чтобы понять, имеет ли это какое-то значение, я не вижу никакого различия.
Может кто-нибудь, пожалуйста, сообщите мне, где происходит неправильное преобразование.