How to return a 64 bit integer using Oracle ODBC driver -
08-20-2004
, 04:04 PM
Hello all!
I am using Oracle 10.1.1 development suite and Oracle 10g database.
I use Oracle ODBC driver to return and process a result set.
I tested unsigned long and signed long datatypes successfully using
SQL_SLONG and SQL_ULONG SQL datatypes when setting up the bindings
(see example below).
When I tried to return a number in __int64 range with SQL_SBIGINT SQL
type, SQLFetch call fails for me with "Invalid SQL data type <-25>".
is this type not supported by Oracle ODBC driver 10? Below is my test
driver code.
SQLRETURN sqlReturn =0x0;
const int MAXBUFLEN = 1024;
SQLCHAR ConnStrOut[MAXBUFLEN];
SQLSMALLINT cbConnStrOut = 0;
string connStr = "DRIVER={Oracle in
OraHome};SERVER=poison.METRATECH.COM;" \
"DBQ=poison.METRATECH.COM;DATABASE=NetMeterBP;UID= nmdbobp;PWD=nmdbobp;MTS=F";
//NON WORKING CASE 1
//–9,223,372,036,854,775,808 - 9,223,372,036,854,775,807
//__int64
string query = "SELECT 9223372036854775807 from dual;";
int datatype = SQL_C_SBIGINT;
sqlReturn = ::SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
ASSERT(sqlReturn == SQL_SUCCESS || sqlReturn ==
SQL_SUCCESS_WITH_INFO);
::SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3,
SQL_IS_INTEGER);
ASSERT(sqlReturn == SQL_SUCCESS || sqlReturn ==
SQL_SUCCESS_WITH_INFO);
sqlReturn = ::SQLAllocHandle(SQL_HANDLE_DBC, env, &hConnection);
ASSERT(sqlReturn == SQL_SUCCESS || sqlReturn ==
SQL_SUCCESS_WITH_INFO);
//STEP1: connect
sqlReturn = ::SQLDriverConnectA(hConnection,// Connection handle
NULL, // Window handle
(unsigned char *) connStr.c_str(),
SQL_NTS, // Null-terminated string
ConnStrOut, // Address of output buffer
MAXBUFLEN, // Size of output buffer
&cbConnStrOut, // Address of output length
SQL_DRIVER_NOPROMPT);
ASSERT(sqlReturn == SQL_SUCCESS);
sqlReturn = ::SQLAllocHandle(SQL_HANDLE_STMT, hConnection, &stmt);
// Status array
SQLUSMALLINT* StatusPtr = new SQLUSMALLINT[1];
int ParamsProcessed = 0;
sqlReturn = ::SQLSetStmtAttr(stmt, SQL_ATTR_PARAM_BIND_TYPE, (void *)
SQL_PARAM_BIND_BY_COLUMN, 0);
sqlReturn = ::SQLSetStmtAttr(stmt, SQL_ATTR_PARAMSET_SIZE, (void *)1,
0);
sqlReturn = ::SQLSetStmtAttr(stmt, SQL_ATTR_PARAM_STATUS_PTR,
StatusPtr, 0);
sqlReturn = ::SQLSetStmtAttr(stmt, SQL_ATTR_PARAMS_PROCESSED_PTR,
&ParamsProcessed, 0);
sqlReturn = ::SQLPrepareA(stmt, (SQLCHAR *)query.c_str(), SQL_NTS);
sqlReturn = ::SQLExecute(stmt);
//BIND OUTPUT
SQLINTEGER indicator;
ODBCINT64 data;
sqlReturn = ::SQLBindCol(stmt, 1, datatype, &data, sizeof(data),
&indicator);
//FETCH FIRST ROW
sqlReturn = ::SQLFetch(stmt);
cout << "Data: " << data <<endl;
Any input is appreciated.
Thanks
Boris |