Получая реальный тип данных с использованием ODBC, данные преобразуются в более высокую точность

У меня есть таблица с реальным типом столбца в 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);

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

введите описание изображения здесь

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

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]