oracle proc/c++ 和 oci to mysql_Linux下使用C/C++访问数据库——Oracle之OCI篇

/*

* OCIDB.cpp

*

*    Created .: Mar 1, 2009

*            Author: Steven Wee

*/

#include "OCIDB.h"

#include "OCIException.h"

#include "OCIError.h"

OCIDB::OCIDB()

{

strcpy(this ->m_sUser, "webtest");

strcpy(this ->m_sPwd, "ns0528AO");

strcpy(this ->m_sDBName, "NSTEST");

this ->BindInitVars();

}

OCIDB::~OCIDB()

{

}

int OCIDB::Single_Conn()

{

try

{

sword errno;

/*

* OCIEnvCreate(&envhp, mode, (const dvoid *)0, 0, 0, 0, (size_t)0, (dvoid **)0 );

*/

errno = OCIEnvCreate( &this ->m_pOCIEnv, OCI_OBJECT, (dvoid *)0, (dvoid *(*)(dvoid *, size_t))0, (dvoid *(*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *))0, (size_t)0, (dvoid **)0);

if(errno)

{

throw OCIException(errno, (char *)"OCIDB::Single_Conn OCIEnvCreate");

}

/* Create Error Handle */

errno = OCIHandleAlloc( (dvoid *)this ->m_pOCIEnv, (dvoid **)&this ->m_pOCIError, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0);

if(errno)

{

throw OCIException(errno, (char *)"OCIDB::Single_Conn OCIHandleAlloc");

}

/* Login */

errno = OCILogon(this ->m_pOCIEnv, this ->m_pOCIError, &this ->m_pOCISvcCtx, (const OraText*)this ->m_sUser,

strlen(this ->m_sUser), (const OraText*)this ->m_sPwd, strlen(this ->m_sPwd), (const OraText*)this ->m_sDBName,

strlen(this ->m_sDBName));

if(errno)

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::Single_Conn OCILogin2");

}

return 0;

}

catch ( OCIException &ex)

{

std::cout << ex.GetErrFunc() << ex.GetErrMsg() << std::endl;

return -1;

}

}

void OCIDB::Single_Disc()

{

sword errno;

/* Log off */

errno = OCILogoff(m_pOCISvcCtx, this ->m_pOCIError);

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::Single_Disc OCILogoff");

}

/* Free errno */

errno = OCIHandleFree((dvoid *)this ->m_pOCIError, (ub4)OCI_HTYPE_ERROR);

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::Single_Disc OCIHandleFree");

}

/* Free Env Handle */

errno = OCIHandleFree((dvoid *)this ->m_pOCIEnv, (ub4)OCI_HTYPE_ENV);

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::Single_Disc OCIHandleFree");

}

}

int OCIDB::Multiple_Conn()

{

try

{

sword errno;

errno = OCIInitialize( (ub4)OCI_DEFAULT, (dvoid *)0, (dvoid *(*)(dvoid *, size_t))0, (dvoid *(*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *))0 );

if ( errno )

{

throw OCIException(errno, (char *)"OCIDB::Multiple_Conn OCIInitialize");

}

errno = OCIEnvInit( (OCIEnv **)&this ->m_pOCIEnv, OCI_DEFAULT, (size_t)0, (dvoid **)0);

if ( errno )

{

throw OCIException(errno, (char *)"OCIDB::Multiple_Conn OCIEnvInit");

}

/* Allocate Error Handle */

errno = OCIHandleAlloc( (dvoid *)this ->m_pOCIEnv, (dvoid **)&this ->m_pOCIError, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0);

if ( errno )

{

throw OCIException(errno, (char *)"OCIDB::Multiple_Conn OCIHandleAlloc Error");

}

/* Allocate Server Context Handle */

errno = OCIHandleAlloc( (dvoid *)this ->m_pOCIEnv, (dvoid **)&this ->m_pOCISvcCtx, OCI_HTYPE_SVCCTX, (size_t)0, (dvoid **)0);

if ( errno )

{

throw OCIException(errno, (char *)"OCIDB::Multiple_Conn OCIHandleAlloc SvcCtx");

}

/* Allocate Server Handle */

errno = OCIHandleAlloc( (dvoid *)this ->m_pOCIEnv, (dvoid **)&this ->m_pOCIServer, OCI_HTYPE_SERVER, (size_t)0, (dvoid **)0);

if ( errno )

{

throw OCIException(errno, (char *)"OCIDB::Multiple_Conn OCIHandleAlloc Server");

}

/* Set Server into ServerContext */

errno = OCIAttrSet( (dvoid *)this ->m_pOCISvcCtx, OCI_HTYPE_SVCCTX, (dvoid *)this ->m_pOCIServer, 0, OCI_ATTR_SERVER, (OCIError *)this ->m_pOCIError);

if ( errno )

{

throw OCIException(errno, (char *)"OCIDB::Multiple_Conn OCIAttrSet Server");

}

/* Attach Server */

errno = OCIServerAttach(this ->m_pOCIServer, this ->m_pOCIError, (text *)this ->m_sDBName, strlen(this ->m_sDBName), OCI_DEFAULT);

if ( errno )

{

throw OCIException(errno, (char *)"OCIDB::Multiple_Conn OCIServerAttach");

}

/* Allocate Session Handle */

errno = OCIHandleAlloc( (dvoid *)this ->m_pOCIEnv, (dvoid **)&this ->m_pOCISession, (ub4)OCI_HTYPE_SESSION, (size_t)0, (dvoid **)0);

if ( errno )

{

throw OCIException(errno, (char *)"OCIDB::Multiple_Conn OCIHandleAlloc Session");

}

/* Set Session into ServerContext */

errno = OCIAttrSet( (dvoid *)this ->m_pOCISvcCtx, (ub4)OCI_HTYPE_SVCCTX, (dvoid *)this ->m_pOCISession, (ub4)0, (ub4)OCI_ATTR_SESSION, (OCIError *)this ->m_pOCIError);

if ( errno )

{

throw OCIException(errno, (char *)"OCIDB::Multiple_Conn OCIAttrSet Session");

}

/* Set Session UserName */

errno = OCIAttrSet( (dvoid *)this ->m_pOCISession, OCI_HTYPE_SESSION, (dvoid *)this ->m_sUser, strlen(this ->m_sUser), OCI_ATTR_USERNAME, (OCIError *)this ->m_pOCIError);

if ( errno )

{

throw OCIException(errno, (char *)"OCIDB::Multiple_Conn OCIAttrSet UserName");

}

/* Set Session Password */

errno = OCIAttrSet( (dvoid *)this ->m_pOCISession, OCI_HTYPE_SESSION, (dvoid *)this ->m_sPwd, (ub4)strlen(this ->m_sPwd), (ub4)OCI_ATTR_PASSWORD, (OCIError *)this ->m_pOCIError);

if ( errno )

{

throw OCIException(errno, (char *)"OCIDB::Multiple_Conn OCIAttrSet Password");

}

/* Session Begin */

errno = OCISessionBegin(this ->m_pOCISvcCtx, this ->m_pOCIError, this ->m_pOCISession, OCI_CRED_RDBMS, OCI_DEFAULT);

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::Multiple_Conn OCISessionBegin");

}

return 0;

}

catch (OCIException &ex)

{

std::cout << ex.GetErrFunc() << ex.GetErrMsg() << std::endl;

return -1;

}

}

void OCIDB::Multiple_Disc()

{

sword errno;

/* End Session */

errno = OCISessionEnd(this ->m_pOCISvcCtx, this ->m_pOCIError, this ->m_pOCISession, (ub4)OCI_DEFAULT);

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::Multiple_Disc OCISessionEnd");

}

/* Free Session */

errno = OCIHandleFree( (dvoid *)this ->m_pOCISession, (ub4)OCI_HTYPE_SESSION );

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::Multiple_Disc OCIHandleFree Session");

}

/* Detach Server */

errno = OCIServerDetach(this ->m_pOCIServer, this ->m_pOCIError, OCI_DEFAULT);

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::Multiple_Disc OCIServerDetach");

}

/* Free Server */

errno = OCIHandleFree( (dvoid *)this ->m_pOCIServer, (ub4)OCI_HTYPE_SERVER );

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::Multiple_Disc OCIHandleFree Server");

}

/* Free ServerContext */

errno = OCIHandleFree( (dvoid *)this ->m_pOCISvcCtx, (ub4)OCI_HTYPE_SVCCTX );

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::Multiple_Disc OCIHandleFree ServerContext");

}

/* Free Error */

errno = OCIHandleFree( (dvoid *)this ->m_pOCIError, (ub4)OCI_HTYPE_ERROR );

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::Multiple_Disc OCIHandleFree Error");

}

/* Free Env */

errno = OCIHandleFree( (dvoid *)this ->m_pOCIEnv, (ub4)OCI_HTYPE_ENV );

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::Multiple_Disc OCIHandleFree Env");

}

}

int OCIDB::ExcuteSQL(char * sql)

{

sword errno;

try

{

/* Allocate Stmt */

errno = OCIHandleAlloc( (dvoid *)this ->m_pOCIEnv, (dvoid **)&this ->m_pOCIStmt, OCI_HTYPE_STMT, (size_t)0, (dvoid **)0);

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::ExcuteSQL OCIHandleAlloc");

}

errno = OCIStmtPrepare(this ->m_pOCIStmt, this ->m_pOCIError, (const OraText *)sql, (ub4)strlen(sql), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT);

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::ExcuteSQL OCIStmtPrepare");

}

errno = OCIStmtExecute(this ->m_pOCISvcCtx, this ->m_pOCIStmt, this ->m_pOCIError, (ub4)1, (ub4)0, (const OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT);

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::ExcuteSQL OCIStmtExecute");

}

errno = OCITransCommit( this ->m_pOCISvcCtx, this ->m_pOCIError, 0);

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::ExcuteSQL OCITransCommit");

}

errno = OCIHandleFree( (dvoid *)this ->m_pOCIStmt, (ub4)OCI_HTYPE_STMT );

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::ExcuteSQL OCIHandleFree");

}

return 0;

}

catch (OCIException &ex)

{

/* Rollback */

errno = OCITransRollback( this ->m_pOCISvcCtx, this ->m_pOCIError, 0);

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::ExcuteSQL OCITransRollback");

}

/* Free Stmt */

errno = OCIHandleFree( (dvoid *)this ->m_pOCIStmt, (ub4)OCI_HTYPE_STMT);

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::ExcuteSQL OCIHandleFree");

}

std::cout << ex.GetErrFunc() << ex.GetErrMsg() << std::endl;

return -1;

}

}

void OCIDB::BindInitVars()

{

int i;

for( i = 0 ; i < MAX_BINDVAR_COUNT - 1 ; i++ )

{

this ->m_BindVars[i].VarType = 0;

this ->m_BindVars[i].VarName = 0;

this ->m_BindVars[i].VarLen = 0;

this ->m_BindVars[i].ValueChar = 0;

}

this ->m_iBindVarsCount = 0;

}

void OCIDB::BindClearVars()

{

int i;

for( i = 0 ; i < m_iBindVarsCount - 1 ; i++ )

{

delete [] this ->m_BindVars[i].VarName;

if ( this ->m_BindVars[i].VarType == SQLT_STR )

delete [] this ->m_BindVars[i].ValueChar;

if ( this ->m_BindVars[i].VarType == SQLT_INT )

delete [] this ->m_BindVars[i].ValueInt;

this ->m_BindVars[i].VarType = 0;

this ->m_BindVars[i].VarName = 0;

this ->m_BindVars[i].VarLen = 0;

this ->m_BindVars[i].ValueChar = 0;

}

this ->m_iBindVarsCount = 0;

}

void OCIDB::BindAddVar(char * name, char * value)

{

if ( this ->m_iBindVarsCount >= MAX_BINDVAR_COUNT )

return;

this ->m_BindVars[this ->m_iBindVarsCount].VarType = SQLT_STR;

this ->m_BindVars[this ->m_iBindVarsCount].VarName = new char[strlen(name) + 1];

strcpy( this ->m_BindVars[this ->m_iBindVarsCount].VarName, name);

this ->m_BindVars[this ->m_iBindVarsCount].ValueChar = new char[strlen(value) + 1];

strcpy( this ->m_BindVars[this ->m_iBindVarsCount].ValueChar, value);

this ->m_BindVars[this ->m_iBindVarsCount].VarLen = strlen(value) + 1;

this ->m_iBindVarsCount++;

}

void OCIDB::BindAddVar(char * name, int * value)

{

if ( this ->m_iBindVarsCount >= MAX_BINDVAR_COUNT )

return;

this ->m_BindVars[this ->m_iBindVarsCount].VarType = SQLT_INT;

this ->m_BindVars[this ->m_iBindVarsCount].VarName = new char[strlen(name) + 1];

strcpy( this ->m_BindVars[this ->m_iBindVarsCount].VarName, name);

this ->m_BindVars[this ->m_iBindVarsCount].ValueInt = new int;

this ->m_BindVars[this ->m_iBindVarsCount].ValueInt = value;

this ->m_BindVars[this ->m_iBindVarsCount].VarLen = sizeof(int);

this ->m_iBindVarsCount++;

}

int OCIDB::BindSQL(char * sql)

{

if( this ->m_iBindVarsCount == 0 )

return -1;

sword errno;

try

{

/* Allocate Stmt */

errno = OCIHandleAlloc( (dvoid *)this ->m_pOCIEnv, (dvoid **)&this ->m_pOCIStmt, OCI_HTYPE_STMT, (size_t)0, (dvoid **)0);

if ( errno )

{

throw OCIException(errno, (char *)"OCIDB::BindSQL OCIHandleAlloc Stmt");

}

/* Prepare Stmt */

errno = OCIStmtPrepare( this ->m_pOCIStmt, this ->m_pOCIError, (const OraText *)sql, (ub4)strlen(sql), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT );

if ( errno )

{

throw OCIException(errno, (char *)"OCIDB::BindSQL OCIStmtPrepare");

}

/* Bind Vars */

int i;

for ( i = 0 ; i < m_iBindVarsCount - 1 ; i++ )

{

/* Bind By Name */

errno = OCIBindByName( this ->m_pOCIStmt, &this ->m_pOCIBind, this ->m_pOCIError, (text *)this ->m_BindVars[i].VarName, -1,

(dvoid *)this ->m_BindVars[i].ValueChar, this ->m_BindVars[i].VarLen, this ->m_BindVars[i].VarType, (dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, OCI_DEFAULT);

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::BindSQL OCIBindByName");

}

/*

errno = OCIBindByPos( this ->m_pOCIStmt, &this ->m_pOCIBind, this ->m_pOCIError, i + 1, (dvoid *)this ->m_BindVars[i].ValueChar,

this ->m_BindVars[i].VarLen, this ->m_BindVars[i].VarType, (dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, OCI_DEFAULT);

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::BindSQL OCIBindByPos");

}

*/

}

/* Execute SQL */

errno = OCIStmtExecute( this ->m_pOCISvcCtx, this ->m_pOCIStmt, this ->m_pOCIError, (ub4)1, (ub4)0, (const OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT);

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::BindSQL OCIStmtExecute");

}

/*  Commit */

errno = OCITransCommit( this ->m_pOCISvcCtx, this ->m_pOCIError, 0);

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::BindSQL OCITransCommit");

}

/* Free Stmt */

errno = OCIHandleFree( (dvoid *)this ->m_pOCIStmt, (ub4)OCI_HTYPE_STMT );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::BindSQL OCIHandleFree");

}

/* Clear Vars */

this ->BindClearVars();

return 0;

}

catch ( OCIException &ex )

{

/* Rollback */

errno = OCITransRollback( this ->m_pOCISvcCtx, this ->m_pOCIError, 0);

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::BindSQL OCITransRollback");

}

/* Free Stmt */

errno = OCIHandleFree( (dvoid *)this ->m_pOCIStmt, (ub4)OCI_HTYPE_STMT);

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::BindSQL OCIHandleFree");

}

this ->BindClearVars();

std::cout << ex.GetErrFunc() << ex.GetErrMsg() << std::endl;

return -1;

}

}

int OCIDB::UserPrepare(char * sql)

{

sword errno;

try

{

/* Allocate Stmt */

errno = OCIHandleAlloc( (dvoid *)this ->m_pOCIEnv, (dvoid **)&this ->m_pOCIStmt, OCI_HTYPE_STMT, (size_t)0, (dvoid **)0 );

if ( errno )

{

throw OCIException(errno, (char *)"OCIDB::UserPrepare OCIHandleAlloc");

}

/* Prepare Stmt */

errno = OCIStmtPrepare( this ->m_pOCIStmt, this ->m_pOCIError, (const OraText *)sql, (ub4)strlen(sql), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT );

if ( errno )

{

throw OCIException(errno, (char *)"OCIDB::UserPrepare OCIStmtPrepare");

}

return 0;

}

catch ( OCIException &ex )

{

/* Free Stmt */

errno = OCIHandleFree( (dvoid *)this ->m_pOCIStmt, (ub4)OCI_HTYPE_STMT );

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::UserPrepare Ex OCIHandleFree");

}

std::cout << ex.GetErrFunc() << ex.GetErrMsg() << std::endl;

return -1;

}

}

int OCIDB::UserFree()

{

sword errno;

/* Free Stmt */

errno = OCIHandleFree( (dvoid *)this ->m_pOCIStmt, (ub4)OCI_HTYPE_STMT );

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::UserFree OCIHandleFree");

return -1;

}

return 0;

}

int OCIDB::UserBind(char * name, char * value)

{

sword errno;

try

{

errno = OCIBindByName( this ->m_pOCIStmt, &this ->m_pOCIBind, this ->m_pOCIError, (text *)name, -1,

(dvoid *)value, strlen(value) + 1, SQLT_STR, (dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, OCI_DEFAULT );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserBind OCIBindByName");

}

return 0;

}

catch ( OCIException &ex )

{

/* Free Stmt */

errno = OCIHandleFree( (dvoid *)this ->m_pOCIStmt, (ub4)OCI_HTYPE_STMT );

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::UserBind Ex OCIHandleFree");

}

std::cout << ex.GetErrFunc() << ex.GetErrMsg() << std::endl;

return -1;

}

}

int OCIDB::UserBind(char * name, int value)

{

sword errno;

try

{

int val = value;

errno = OCIBindByName( this ->m_pOCIStmt, &this ->m_pOCIBind, this ->m_pOCIError, (text *)name, -1,

(dvoid *)&val, sizeof(int), SQLT_INT, (dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, OCI_DEFAULT );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserBind OCIBindByName");

}

return 0;

}

catch ( OCIException &ex )

{

/* Free Stmt */

errno = OCIHandleFree( (dvoid *)this ->m_pOCIStmt, (ub4)OCI_HTYPE_STMT );

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::UserBind Ex OCIHandleFree");

}

std::cout << ex.GetErrFunc() << ex.GetErrMsg() << std::endl;

return -1;

}

}

int OCIDB::UserExecute()

{

sword errno;

try

{

errno = OCIStmtExecute( this ->m_pOCISvcCtx, this ->m_pOCIStmt, this ->m_pOCIError, (ub4)1, (ub4)0,

(const OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserExecute OCIBindByName");

}

return 0;

}

catch ( OCIException &ex )

{

/* Free Stmt */

errno = OCIHandleFree( (dvoid *)this ->m_pOCIStmt, (ub4)OCI_HTYPE_STMT );

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::UserExecute Ex OCIHandleFree");

}

std::cout << ex.GetErrFunc() << ex.GetErrMsg() << std::endl;

return -1;

}

}

int OCIDB::UserCommit()

{

sword errno;

errno = OCITransCommit( this ->m_pOCISvcCtx, this ->m_pOCIError, 0);

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::UserCommit OCITransCommit");

return -1;

}

return 0;

}

int OCIDB::UserSelect(char * sql)

{

sword errno;

try

{

/* Allocate Stmt */

errno = OCIHandleAlloc( (dvoid *)this ->m_pOCIEnv, (dvoid **)&this ->m_pOCIStmt, OCI_HTYPE_STMT, (size_t)0, (dvoid **)0 );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIHandleAlloc");

}

/* Prepare Stmt */

errno = OCIStmtPrepare( this ->m_pOCIStmt, this ->m_pOCIError, (const OraText *)sql, (ub4)strlen(sql), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIStmtPrepare");

}

/* Execute Stmt */

errno = OCIStmtExecute( this ->m_pOCISvcCtx, this ->m_pOCIStmt, this ->m_pOCIError, (ub4)0, (ub4)0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIStmtExecute");

}

errno = OCIAttrGet( this ->m_pOCIStmt, (ub4)OCI_HTYPE_STMT, (dvoid *)&this ->m_iSelectVarsCount, (ub4 *)0, (ub4)OCI_ATTR_PARAM_COUNT, this ->m_pOCIError );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIAttrGet");

}

int iLen;

char * sName;

ub2 iSize, iPrecision, iType;

ub1 iScale, iIsNull;

int i;

for ( i = 0 ; i < this ->m_iSelectVarsCount ; i++ )

{

sName = 0;

errno = OCIParamGet( this ->m_pOCIStmt, OCI_HTYPE_STMT, this ->m_pOCIError, (dvoid **)&this ->m_pOCIParam, i+ 1 );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIParamGet");

}

//  Column Name

errno = OCIAttrGet( (dvoid *)this ->m_pOCIParam, OCI_DTYPE_PARAM, (dvoid **)&sName, (ub4 *)&iLen, OCI_ATTR_NAME, this ->m_pOCIError );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIAttrGet Column Name");

}

strncpy( this ->m_SelectVars[i].VarName, sName, iLen );

this ->m_SelectVars[i].VarName[iLen] = 0;

//  Data Size;

errno = OCIAttrGet( (dvoid *)this ->m_pOCIParam, OCI_DTYPE_PARAM, (dvoid *)&iSize, (ub4 *)0, OCI_ATTR_DATA_SIZE, this ->m_pOCIError );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIAttrGet Data Size");

}

this ->m_SelectVars[i].VarSize = iSize;

//  Data Precision

errno = OCIAttrGet( (dvoid *)this ->m_pOCIParam, OCI_DTYPE_PARAM, (dvoid *)&iPrecision, (ub4 *)0, OCI_ATTR_PRECISION, this ->m_pOCIError );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIAttrGet Data Precision");

}

this ->m_SelectVars[i].VarPrecision = iPrecision;

//  Data Scale

errno = OCIAttrGet( (dvoid *)this ->m_pOCIParam, OCI_DTYPE_PARAM, (dvoid *)&iScale, (ub4 *)0, OCI_ATTR_SCALE, this ->m_pOCIError );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIAttrGet Data Scale");

}

this ->m_SelectVars[i].VarScale = iScale;

//  Data Is Null

errno = OCIAttrGet( (dvoid *)this ->m_pOCIParam, OCI_DTYPE_PARAM, (dvoid *)&iIsNull, (ub4 *)0, OCI_ATTR_IS_NULL, this ->m_pOCIError );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIAttrGet Data Is Null");

}

this ->m_SelectVars[i].VarIsNull = iIsNull;

//  Data Type

errno = OCIAttrGet( (dvoid *)this ->m_pOCIParam, OCI_DTYPE_PARAM, (dvoid *)&iType, (ub4 *)0, OCI_ATTR_DATA_TYPE, this ->m_pOCIError );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIAttrGet Data Type");

}

this ->m_SelectVars[i].VarType = iType;

switch ( this ->m_SelectVars[i].VarType )

{

case SQLT_NUM:

if ( this ->m_SelectVars[i].VarScale == 0 )

{

this ->m_SelectVars[i].ValueInt = new int;

this ->m_SelectVars[i].VarType = TYPE_INT;

errno = OCIDefineByPos( this ->m_pOCIStmt, &this ->m_pOCIDefine, this ->m_pOCIError, i + 1,

(dvoid *)this ->m_SelectVars[i].ValueInt,  sizeof(int), SQLT_INT, this ->indp, (ub2 *)0, (ub2 *)0, OCI_DEFAULT );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIDefineByPos");

}

}

else

{

this ->m_SelectVars[i].ValueFloat = new float;

this ->m_SelectVars[i].VarType = TYPE_FLOAT;

errno = OCIDefineByPos( this ->m_pOCIStmt, &this ->m_pOCIDefine, this ->m_pOCIError, i + 1,

(dvoid *)this ->m_SelectVars[i].ValueFloat,  sizeof(float), SQLT_FLT, this ->indp, (ub2 *)0, (ub2 *)0, OCI_DEFAULT );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIDefineByPos");

}

}

break;

case SQLT_CHR:

this ->m_SelectVars[i].ValueChar = new char[this ->m_SelectVars[i].VarSize + 1];

this ->m_SelectVars[i].VarType = TYPE_STRING;

errno = OCIDefineByPos( this ->m_pOCIStmt, &this ->m_pOCIDefine, this ->m_pOCIError, i + 1,

(dvoid *)this ->m_SelectVars[i].ValueChar,  this ->m_SelectVars[i].VarSize + 1, SQLT_STR, this ->indp, (ub2 *)0, (ub2 *)0, OCI_DEFAULT );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIDefineByPos");

}

break;

case SQLT_BLOB:

/* Allocate lobLocator */

errno = OCIDe.orAlloc( (dvoid *)this ->m_pOCIEnv, (dvoid **)&this ->m_SelectVars[i].lobLocator, (ub4)OCI_DTYPE_LOB, (size_t)0, (dvoid **)0 );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIDe.orAlloc");

}

this ->m_SelectVars[i].VarType = TYPE_BLOB;

errno = OCIDefineByPos( this ->m_pOCIStmt, &this ->m_pOCIDefine, this ->m_pOCIError, (ub4)i + 1, (dvoid *)&this ->m_SelectVars[i].lobLocator, (sb4)0,

(ub2)SQLT_BLOB, this ->indp, (ub2 *)0, (ub2 *)0, (ub4)OCI_DEFAULT);

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIDefineByPos");

}

break;

case SQLT_CLOB:

/* Allocate lobLocator */

errno = OCIDe.orAlloc( (dvoid *)this ->m_pOCIEnv, (dvoid **)&this ->m_SelectVars[i].lobLocator, (ub4)OCI_DTYPE_LOB, (size_t)0, (dvoid **)0 );

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIDe.orAlloc");

}

this ->m_SelectVars[i].VarType = TYPE_BLOB;

errno = OCIDefineByPos( this ->m_pOCIStmt, &this ->m_pOCIDefine, this ->m_pOCIError, (ub4)i + 1, (dvoid *)&this ->m_SelectVars[i].lobLocator, (sb4)0,

(ub2)SQLT_BLOB, this ->indp, (ub2 *)0, (ub2 *)0, (ub4)OCI_DEFAULT);

if ( errno )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserSelect OCIDefineByPos");

}

break;

}

}

return 0;

}

catch ( OCIException &ex )

{

/* Free Stmt */

errno = OCIHandleFree( (dvoid *)this ->m_pOCIStmt, (ub4)OCI_HTYPE_STMT );

if ( errno )

{

OCIError::PrintError(errno, (char *)"OCIDB::UserExecute Ex OCIHandleFree");

}

std::cout << ex.GetErrFunc() << ex.GetErrMsg() << std::endl;

return -1;

}

}

int OCIDB::UserFetch()

{

sword errno;

try

{

errno = OCIStmtFetch( this ->m_pOCIStmt, this ->m_pOCIError, 1, OCI_FETCH_NEXT, OCI_DEFAULT );

if ( errno && errno != OCI_NO_DATA )

{

throw OCIException(errno, this ->m_pOCIError, (char *)"OCIDB::UserFetch OCIStmtFetch");

}

if ( errno == OCI_NO_DATA )

return 1;

return 0;

}

catch ( OCIException &ex )

{

std::cout << ex.GetErrFunc() << ex.GetErrMsg() << std::endl;

return -1;

}

}

int OCIDB::UserSelectFree()

{

int i;

for ( i = 0 ; i < this ->m_iSelectVarsCount ; i++ )

{

switch ( this ->m_SelectVars[i].VarType )

{

case TYPE_STRING:

delete [] this ->m_SelectVars[i].ValueChar;

break;

case TYPE_FLOAT:

delete this ->m_SelectVars[i].ValueFloat;

break;

case TYPE_INT:

delete this ->m_SelectVars[i].ValueInt;

break;

}

}

return this ->UserFree();

}

int OCIDB::UserGetInt(int index)

{

switch ( this ->m_SelectVars[index].VarType )

{

case TYPE_FLOAT:

return (int)*m_SelectVars[index].ValueFloat;

break;

case TYPE_INT:

return *m_SelectVars[index].ValueInt;

break;

default:

return 0;

}

}

int OCIDB::UserGetInt(char * name)

{

int i;

for ( i = 0 ; i < this ->m_iSelectVarsCount ; i++ )

{

if ( this ->StrCmp(m_SelectVars[i].VarName, name) )

{

switch ( this ->m_SelectVars[i].VarType )

{

case TYPE_FLOAT:

return (int)*m_SelectVars[i].ValueFloat;

break;

case TYPE_INT:

return *m_SelectVars[i].ValueInt;

break;

default:

return 0;

}

}

}

return 0;

}

float OCIDB::UserGetFloat(int index)

{

switch ( this ->m_SelectVars[index].VarType )

{

case TYPE_FLOAT:

return *m_SelectVars[index].ValueFloat;

break;

case TYPE_INT:

return (float)*m_SelectVars[index].ValueInt;

break;

default:

return 0;

}

}

float OCIDB::UserGetFloat(char * name)

{

int i;

for ( i = 0 ; i < this ->m_iSelectVarsCount ; i++ )

{

if ( this ->StrCmp(m_SelectVars[i].VarName, name) )

{

switch ( this ->m_SelectVars[i].VarType )

{

case TYPE_FLOAT:

return *m_SelectVars[i].ValueFloat;

break;

case TYPE_INT:

return (float)*m_SelectVars[i].ValueInt;

break;

default:

return 0;

}

}

}

return 0;

}

char * OCIDB::UserGetString(int index)

{

if ( this ->m_SelectVars[index].VarType == TYPE_STRING )

{

return this ->m_SelectVars[index].ValueChar;

}

else

{

return 0;

}

}

char * OCIDB::UserGetString(char * name)

{

int i;

for ( i = 0 ; i < this ->m_iSelectVarsCount ; i++ )

{

if ( this ->StrCmp(m_SelectVars[i].VarName, name) )

{

if ( this ->m_SelectVars[i].VarType == TYPE_STRING )

{

return this ->m_SelectVars[i].ValueChar;

}

}

}

return 0;

}

char * OCIDB::UserGetBlob(int index)

{

if ( this ->m_SelectVars[index].VarType == TYPE_BLOB )

{

return this ->m_SelectVars[index].ValueChar;

}

else

{

return 0;

}

}

char * OCIDB::UserGetBlob(char * name)

{

int i;

for ( i = 0 ; i < this ->m_iSelectVarsCount ; i++ )

{

if ( this ->StrCmp(m_SelectVars[i].VarName, name) )

{

if ( this ->m_SelectVars[i].VarType == TYPE_BLOB )

{

return this ->m_SelectVars[i].ValueChar;

}

}

}

return 0;

}

vector< vector > OCIDB::getResult()

{

int i;

vector objectValue;

StringTools stringTools;

while ( this ->UserFetch() == 0 )

{

objectValue.clear();

for ( i = 0 ; i < this ->m_iSelectVarsCount ; i++ )

{

switch ( this ->m_SelectVars[i].VarType )

{

case TYPE_STRING:

objectValue.push_back(this ->UserGetString(i));

break;

case TYPE_FLOAT:

objectValue.push_back(stringTools.ToString(this ->UserGetFloat(i)));

break;

case TYPE_INT:

objectValue.push_back(stringTools.ToString(this ->UserGetInt(i)));

break;

case TYPE_BLOB:

break;

}

}

resultList.push_back(objectValue);

}

return resultList;

}

void inline OCIDB::StrUpper(char * str)

{

int i;

int sLen = strlen(str);

for ( i = 0 ; i < sLen ; i++ )

{

str[i] = toupper(str[i]);

}

}

bool inline OCIDB::StrCmp(const char * ori, const char * des)

{

int iLenOri, iLenDes;

int j;

iLenOri = strlen(ori);

iLenDes = strlen(des);

if ( iLenOri != iLenDes )

return false;

for ( j = 0 ; j < iLenOri ; j++ )

{

if ( toupper(ori[j]) != toupper(des[j]) )

{

return false;

}

}

return true;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值