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