dbTalk Databases Forums  

How to return a 64 bit integer using Oracle ODBC driver

comp.database.oracle comp.database.oracle


Discuss How to return a 64 bit integer using Oracle ODBC driver in the comp.database.oracle forum.



Reply
 
Thread Tools Display Modes
  #1  
Old   
Boris Partensky
 
Posts: n/a

Default 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

Reply With Quote
Reply




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off



Powered by vBulletin Version 3.5.3
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.