我在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),以查看是否有任何区别,我看不出有什么区别。
请让我知道转换出错了。