⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 orabase.cpp

📁 C++OCI,针对8.0.4以上的数据库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		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 + -