📄 orabase.cpp
字号:
{
GetOCIErrInfo(m_hOCI.phErr, m_nErrCode, m_szOCIErrInfoArr, ERRINFO_MAX_LEN);
//释放服务句柄
OCIHandleFree((dvoid *)m_hOCI.phService, OCI_HTYPE_SVCCTX);
m_hOCI.phService = NULL;
m_hOCI.bSvcInit = false;
//释放错误句柄
OCIHandleFree((dvoid *)m_hOCI.phErr, OCI_HTYPE_ERROR);
m_hOCI.phErr = NULL;
m_hOCI.bStmtInit = false;
//释放环境句柄
OCIHandleFree((dvoid *)m_hOCI.phEnv, OCI_HTYPE_ENV);
m_hOCI.phEnv = NULL;
m_hOCI.bEnvInit = false;
return ERR_OCI_STMT_8I;
}
else
m_hOCI.bStmtInit = true;
//分配服务器句柄(没有初始化)
rc = OCIHandleAlloc((dvoid *)m_hOCI.phEnv,
(dvoid **)&(m_hOCI.phServer),
(ub4)OCI_HTYPE_SERVER,
(size_t) 0,
(dvoid **) 0);
if(OCI_SUCCESS != rc)
{
GetOCIErrInfo(m_hOCI.phErr, m_nErrCode, m_szOCIErrInfoArr, ERRINFO_MAX_LEN);
//释放服务句柄
OCIHandleFree((dvoid *)m_hOCI.phService, OCI_HTYPE_SVCCTX);
m_hOCI.phService = NULL;
m_hOCI.bSvcInit = false;
//释放语句句柄
OCIHandleFree((dvoid *)m_hOCI.phStmt, OCI_HTYPE_STMT);
m_hOCI.phStmt = NULL;
m_hOCI.bStmtInit = false;
//释放错误句柄
OCIHandleFree((dvoid *)m_hOCI.phErr, OCI_HTYPE_ERROR);
m_hOCI.phErr = NULL;
m_hOCI.bStmtInit = false;
//释放环境句柄
OCIHandleFree((dvoid *)m_hOCI.phEnv, OCI_HTYPE_ENV);
m_hOCI.phEnv = NULL;
m_hOCI.bEnvInit = false;
return ERR_OCI_SRV_8I;
}
else
m_hOCI.bSrvInit = true;
//分配会话句柄
rc = OCIHandleAlloc((dvoid *)m_hOCI.phEnv,
(dvoid **)&(m_hOCI.phSession),
(ub4)OCI_HTYPE_SESSION,
(size_t) 0,
(dvoid **) 0);
if(OCI_SUCCESS != rc)
{
GetOCIErrInfo(m_hOCI.phErr, m_nErrCode, m_szOCIErrInfoArr, ERRINFO_MAX_LEN);
//释放服务句柄
OCIHandleFree((dvoid *)m_hOCI.phService, OCI_HTYPE_SVCCTX);
m_hOCI.phService = NULL;
m_hOCI.bSvcInit = false;
//释放服务器句柄
OCIHandleFree((dvoid *)m_hOCI.phServer, OCI_HTYPE_SERVER);
m_hOCI.phServer = NULL;
m_hOCI.bSrvInit = false;
//释放语句句柄
OCIHandleFree((dvoid *)m_hOCI.phStmt, OCI_HTYPE_STMT);
m_hOCI.phStmt = NULL;
m_hOCI.bStmtInit = false;
//释放错误句柄
OCIHandleFree((dvoid *)m_hOCI.phErr, OCI_HTYPE_ERROR);
m_hOCI.phErr = NULL;
m_hOCI.bStmtInit = false;
//释放环境句柄
OCIHandleFree((dvoid *)m_hOCI.phEnv, OCI_HTYPE_ENV);
m_hOCI.phEnv = NULL;
m_hOCI.bEnvInit = false;
return ERR_OCI_SRV_8I;
}
else
m_hOCI.bSessionInit = true;
//初始化成功
m_bOCIInit = true;
//返回
return GW_SUCCESS;
}
//使一个OCI进程与共享内存分离,也是结束该进程
int COraBase::OCITerminateProcMemory()
{
if(m_bOCIInit)
{
//释放语句句柄空间
if(m_hOCI.bStmtInit)
{
OCIHandleFree((dvoid *)m_hOCI.phStmt, OCI_HTYPE_STMT );
m_hOCI.phStmt = NULL;
m_hOCI.bStmtInit = false;
}
//释放错误句柄
if(m_hOCI.bErrInit)
{
OCIHandleFree((dvoid *)m_hOCI.phErr, OCI_HTYPE_ERROR );
m_hOCI.phErr = NULL;
m_hOCI.bErrInit = false;
}
//释放上下文服务句柄
if(m_hOCI.bSvcInit)
{
OCIHandleFree((dvoid *)m_hOCI.phService, OCI_HTYPE_SVCCTX);
m_hOCI.phService = NULL;
m_hOCI.bSvcInit = false;
}
//释放服务器句柄
if(m_hOCI.bSrvInit)
{
OCIHandleFree((dvoid *)m_hOCI.phServer, OCI_HTYPE_SERVER);
m_hOCI.phServer = NULL;
m_hOCI.bSrvInit = false;
}
//释放会话句柄
if(m_hOCI.bSessionInit)
{
OCIHandleFree((dvoid *)m_hOCI.phSession, OCI_HTYPE_SESSION);
m_hOCI.phSession = NULL;
m_hOCI.bSessionInit = false;
}
//释放环境句柄
if(m_hOCI.bEnvInit)
{
OCIHandleFree((dvoid *)m_hOCI.phEnv, OCI_HTYPE_ENV);
m_hOCI.phEnv = NULL;
m_hOCI.bEnvInit = false;
}
//释放7.3.3的指针空间
if(m_hOCI.bLdaDefInit)
{
if(NULL != m_hOCI.pLdaDef)
{
free(m_hOCI.pLdaDef);
m_hOCI.pLdaDef = NULL;
m_hOCI.bLdaDefInit = FALSE;
}
}
//结束进程
if(OCI_SUCCESS != OCITerminate(OCI_DEFAULT))
{
return ERR_OCI_ENDPROC_8I;
}
else
{
m_bOCIInit = FALSE;
return GW_SUCCESS;
}
}
else
return GW_SUCCESS;
}
//释放OCI的句柄空间,但是OCI环境的共享内存依然存在
//Paramer:
// OCIHANDLE hOCI [in] //OCI的句柄
void COraBase::OCIFree(OCIHANDLE hOCI)
{
if(m_bOCIInit)
{
//释放语句句柄空间
if(m_hOCI.bStmtInit)
{
OCIHandleFree((dvoid *)m_hOCI.phStmt, OCI_HTYPE_STMT );
m_hOCI.phStmt = NULL;
m_hOCI.bStmtInit = false;
}
//释放错误句柄
if(m_hOCI.bErrInit)
{
OCIHandleFree((dvoid *)m_hOCI.phErr, OCI_HTYPE_ERROR );
m_hOCI.phErr = NULL;
m_hOCI.bErrInit = FALSE;
}
//释放上下文服务句柄
if(m_hOCI.bSvcInit)
{
OCIHandleFree((dvoid *)m_hOCI.phService, OCI_HTYPE_SVCCTX);
m_hOCI.phService = NULL;
m_hOCI.bSvcInit = false;
}
//释放服务器句柄
if(m_hOCI.phServer)
{
OCIHandleFree((dvoid *)m_hOCI.phServer, OCI_HTYPE_SERVER);
m_hOCI.phServer = NULL;
m_hOCI.bSrvInit = false;
}
//释放会话句柄
if(m_hOCI.bSessionInit)
{
OCIHandleFree((dvoid *)m_hOCI.phSession, OCI_HTYPE_SESSION);
m_hOCI.phSession = NULL;
m_hOCI.bSessionInit = false;
}
//释放环境句柄
if(m_hOCI.bEnvInit)
{
OCIHandleFree((dvoid *)m_hOCI.phEnv, OCI_HTYPE_ENV);
m_hOCI.phEnv = NULL;
m_hOCI.bEnvInit = false;
}
//释放7.3.3的指针空间
if(m_hOCI.bLdaDefInit)
{
if(NULL != m_hOCI.pLdaDef)
{
free(m_hOCI.pLdaDef);
m_hOCI.pLdaDef = NULL;
m_hOCI.bLdaDefInit = false;
}
}
}
}
//获得Oracle的出错信息
//成功返回0,否则返回-1
int COraBase::GetOCIErrInfo(OCIError *phOCIErr, int &nErrCode, char *pszOCIErrInfo, int nOCIErrInfoLen)
{
if(NULL == phOCIErr || NULL == pszOCIErrInfo || 0 >= nOCIErrInfoLen)
return -1;
//获得OCI的错误
OCIErrorGet((dvoid *)phOCIErr,
(ub4)1,
(text *)NULL,
&nErrCode,
(text *)pszOCIErrInfo,
(ub4)nOCIErrInfoLen,
(ub4)OCI_HTYPE_ERROR);
//返回
return 0;
}
//8.0.4以上的短开连接数据库,注意并没有释放各个句柄的空间,这是由oracle的特性决定的
//Param:
// OCIHANDLE hOCI [in] //Oracle的句柄
int COraBase::OCILogout(OCIHANDLE hOCI)
{
if(!m_bOCIInit)
return ERR_OCI_HANDLE_NO_INIT; //没有初始化
//结束会话
int rc = OCISessionEnd(hOCI.phService, hOCI.phErr, hOCI.phSession, OCI_DEFAULT);
if(OCI_SUCCESS != rc)
{
GetOCIErrInfo(m_hOCI.phErr, m_nErrCode, m_szOCIErrInfoArr, ERRINFO_MAX_LEN);
return ERR_OCI_SESSION_END; //无法断开与oracle的会话
}
//结束与服务器的连接
rc = OCIServerDetach(hOCI.phServer, hOCI.phErr, OCI_DEFAULT);
if(OCI_SUCCESS != rc)
{
GetOCIErrInfo(m_hOCI.phErr, m_nErrCode, m_szOCIErrInfoArr, ERRINFO_MAX_LEN);
return ERR_OCI_DETACH; //无法断开与oracle服务器的连接
}
else
return GW_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -