出于一些背景知识,我目前正在致力于将解决方案从Windows转换为Linux。该解决方案实质上是使用ODBC通过按需读写来与PostgreSQL数据库进行交互。我正在通过Oracle VM VirtualBox运行Debian构建。
出于某些(我不知道)原因,当从查询中获取数据时,在LINUX上执行时,我收到一个不同的double值。例如,如果我直接使用PGadmin查询数据库,我将得到一个像1.09933996200562(类型:double precision)的值,如果我使用ODBC从我的解决方案中运行相同的查询,我将得到1.09934(出于我的目的,这种略微取整是可以的) 。但是,当从LINUX上的解决方案中通过odbc运行相同的查询时,我得到了1.10237。注意:在两种情况下,解决方案都将返回值存储为双精度值。
有人知道是什么导致它在LINUX上以这种方式舍入值吗?我尝试将值存储为长整型,以查看是否可能有任何影响,但效果不佳。如果有人有解决此问题的经验,将不胜感激。
这里建议的是程序的一部分,它将重新创建问题...
void main()
{
SQLHANDLE sqlEnvH = NULL;
SQLHANDLE sqlConnH = NULL;
SQLHANDLE hStmt = NULL;
string SQLConnectionString;
char connectionString[256];
SQLSMALLINT numCols;
SQLConnectionString = "Driver={PostgreSQL UNICODE};Server=localhost;Port=5544;Database=TSDB4;Uid=;Pwd=;";
strcpy(connectionString, SQLConnectionString.c_str());
if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlEnvH))
cout << "ok" << endl;
if (SQL_SUCCESS == SQLSetEnvAttr(sqlEnvH, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0))
cout << "ok1" << endl;
if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_DBC, sqlEnvH, &sqlConnH))
{
cout << "ok2" << endl;
SQLCHAR retconstring[1024];
SQLRETURN retcode = SQLDriverConnect(
sqlConnH,
NULL,
(SQLCHAR *) connectionString,
SQL_NTS,
retconstring,
1024,
NULL,
SQL_DRIVER_NOPROMPT);
if ((retcode == SQL_SUCCESS))
{
cout << "success" << endl;
}
else if(retcode == SQL_SUCCESS_WITH_INFO)
{
cout << "success with info" << endl;
}
else
cout << "failure on connect..." <<endl;
}
if(SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT,sqlConnH, &hStmt))
cout << "failed to alloc stmt handle" << endl;
SQLExecDirect(hStmt,(SQLCHAR*)"select * from usp_getseriesparameters(1)", SQL_NTS) ;
if(SQLNumResultCols (hStmt, &numCols) != SQL_SUCCESS)
{
cout << "no column numbers?" << endl;
}
cout << numCols << endl;
if(SQLFetch(hStmt) != SQL_SUCCESS)
{
cout << "fail \n";
}
double retVal[256];
double FieldValue;
if ( SQL_NO_DATA != SQLGetData(hStmt,5,SQL_C_DEFAULT,retVal,256,NULL))
{
FieldValue = *retVal;
cout << FieldValue << endl;
}
SQLRETURN retcode;
}
请注意,EXECDirect正在查询数据库中的表(第5列),该表包含存储为“双精度”的值。在Windows上显示1.09934,在LINUX上显示1.10237。