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

📄 orabase.cpp

📁 C++OCI,针对8.0.4以上的数据库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// OraBase.cpp: implementation of the COraBase class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "LOB.h"
#include "OraBase.h"
#include "Error.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
COraBase::COraBase()
{
	//初始话OCI句柄
	m_hOCI.phEnv = NULL;
	m_hOCI.phErr = NULL;
	m_hOCI.phStmt = NULL;
	m_hOCI.phService = NULL;
	m_hOCI.pLdaDef = NULL;
	m_hOCI.phSession = NULL;
	m_hOCI.phServer = NULL;

    m_hOCI.bEnvInit = false;
	m_hOCI.bErrInit = false;
	m_hOCI.bStmtInit = false;
	m_hOCI.bSvcInit = false;
	m_hOCI.bLdaDefInit = false;
	m_hOCI.bSessionInit = false;
	m_hOCI.bSrvInit = false;

	//OIC环境没有被初始化
	m_bOCIInit = false;
}

COraBase::~COraBase()
{
	 
}

//登录函数,针对8.0.4以上的数据库
//Paramer:
//        char *pszHost       [in]   //数据库服务名
//        char *pszPort       [in]   //端口号
//        char *pszUserName   [in]   //用户名
//        char *pszPassWord   [in]   //口令
//如果成功登录oracle数据库,则返回0,否则返回非0
int COraBase::OCILogin(char *pszHost, char *pszPort, char *pszUserName, char *pszPassWord)
{
	try
	{
		if(!m_bOCIInit)  //检查OCI环境是否已经初始化
			return ERR_OCI_HANDLE_NO_INIT; //没有初始化

		//连接数据库,并初始化服务器句柄(或说创建OCI操作Oracle数据库的数据源)
		int rc = OCIServerAttach(m_hOCI.phServer, m_hOCI.phErr, (text *)pszHost, (sb4)strlen(pszHost), OCI_DEFAULT);
		if(OCI_SUCCESS != rc)
		{
			GetOCIErrInfo(m_hOCI.phErr, m_nErrCode, m_szOCIErrInfoArr, ERRINFO_MAX_LEN);
			OCIFree(m_hOCI);
			return ERR_OCI_SERVER_ATTACH; //无法连接指定的数据源
		}

		//设置会话句柄属性中用户名
		rc = OCIAttrSet((dvoid *)m_hOCI.phSession, 
			            (ub4) OCI_HTYPE_SESSION,
						(dvoid *)pszUserName,
						(ub4)strlen(pszUserName),
						(ub4)OCI_ATTR_USERNAME,
						m_hOCI.phErr);
		if(OCI_SUCCESS != rc)
		{
			GetOCIErrInfo(m_hOCI.phErr, m_nErrCode, m_szOCIErrInfoArr, ERRINFO_MAX_LEN);
			OCIFree(m_hOCI);
			return ERR_OCI_ATT_SESSION_UID; //无法对会话句柄添加用户名
		}

		//设置会话句柄属性中密码
		rc = OCIAttrSet((dvoid *)m_hOCI.phSession, 
			            (ub4)OCI_HTYPE_SESSION,
						(dvoid *)pszPassWord,
						(ub4)strlen(pszPassWord),
						(ub4)OCI_ATTR_PASSWORD,
						m_hOCI.phErr);
		if(OCI_SUCCESS != rc)
		{
			GetOCIErrInfo(m_hOCI.phErr, m_nErrCode, m_szOCIErrInfoArr, ERRINFO_MAX_LEN);
			OCIFree(m_hOCI);
			return ERR_OCI_ATT_SESSION_PWD; //无法对会话句柄添加密码
		}

		//在服务(连接)句柄中加入服务器句柄的属性
		rc = OCIAttrSet((dvoid *)m_hOCI.phService, 
			            (ub4)OCI_HTYPE_SVCCTX,
						(dvoid *)m_hOCI.phServer,
						(ub4)0,
						OCI_ATTR_SERVER, 
						m_hOCI.phErr);
		if(OCI_SUCCESS != rc)
		{
			GetOCIErrInfo(m_hOCI.phErr, m_nErrCode, m_szOCIErrInfoArr, ERRINFO_MAX_LEN);
			OCIFree(m_hOCI);
			return ERR_OCI_ATT_SRV_IN_SVC; //无法在服务(连接)句柄中加入服务器句柄的属性
		}
		
		//登录数据库,也就是创建一个用户会话,在这里将初始化会话句柄
		rc = OCISessionBegin(m_hOCI.phService, m_hOCI.phErr, m_hOCI.phSession, OCI_CRED_RDBMS, OCI_DEFAULT);     
		if(OCI_SUCCESS != rc)
		{
			GetOCIErrInfo(m_hOCI.phErr, m_nErrCode, m_szOCIErrInfoArr, ERRINFO_MAX_LEN);
			OCIFree(m_hOCI);
			return ERR_OCI_OLOG_8I; //登录失败
		}

		//把会话句柄的属性加载到服务句柄中
		rc = OCIAttrSet((dvoid *)m_hOCI.phService, 
			            (ub4)OCI_HTYPE_SVCCTX, 
						(dvoid *)m_hOCI.phSession, 
						(ub4)0, 
						(ub4)OCI_ATTR_SESSION, 
						m_hOCI.phErr); 
		if(OCI_SUCCESS != rc)
		{
			GetOCIErrInfo(m_hOCI.phErr, m_nErrCode, m_szOCIErrInfoArr, ERRINFO_MAX_LEN);
			OCILogout(m_hOCI);
			OCIFree(m_hOCI);
			return ERR_OCI_ATT_SES_IN_SVC; //无法把会话句柄的属性加载到服务句柄中
		}
		
		/*//为了兼容7.3.3,开辟起指针空间
		m_hOCI.pLdaDef = (Lda_Def *)malloc(sizeof(Lda_Def));
		if(NULL == m_hOCI.pLdaDef)
		{
			OCILogout(m_hOCI);
			OCIFree(m_hOCI);
			return ERR_SYS_MEM_ALLOC;
		}
		else
			m_hOCI.bLdaDefInit = true;
		
		//把句柄中的数值存放到Lda_Def中
		rc = OCISvcCtxToLda(m_hOCI.phService, m_hOCI.phErr, m_hOCI.pLdaDef);
		if(OCI_SUCCESS != rc)
		{
			if(NULL != m_hOCI.pLdaDef)
			{
				free(m_hOCI.pLdaDef);
				m_hOCI.pLdaDef = NULL;
				m_hOCI.bLdaDefInit = false;
			}
			GetOCIErrInfo(m_hOCI.phErr, m_nErrCode, m_szOCIErrInfoArr, ERRINFO_MAX_LEN);
			OCILogout(m_hOCI);
			OCIFree(m_hOCI);
			return ERR_OCI_TACHI_8I;
		}
		*/
		//成功,返回
		return GW_SUCCESS;
	}
	catch(...)
	{
		return ERR_OCI_OLOG_8I_EXCEP;//登录8i异常
	}
}

//登录函数,针对7.3.3以上的数据库
//Paramer:
//        char *pszHost       [in]   //数据库服务名
//        char *pszUserName   [in]   //用户名
//        char *pszPassWord   [in]   //口令
//如果成功登录oracle数据库,则返回0,否则返回非0
int COraBase::OCILogin(char *pszHost, char *pszUserName, char *pszPassWord)
{
	//检查指针的有效性
	if(NULL == pszHost || NULL == pszUserName || NULL == pszPassWord)
		return ERR_POINT_INVAILD;
	
	//定义登录Oracle的指针
    Lda_Def *pLda_Def = (Lda_Def *)malloc(sizeof(Lda_Def) * 2);
	if(NULL == pLda_Def)
		return ERR_SYS_MEM_ALLOC;
   
	//登录oracle
	ub1 hstb[256];
	if(olog(pLda_Def, 
		    hstb, 
		    (text *)pszUserName, 
		    -1, 
		    (text *)pszPassWord, 
		    -1,
		    (text *)pszHost,
		    -1, 
		   OCI_LM_DEF))
	{
		return ERR_OCI_OLOG_73;
	}

	//保存登录的有效指针
	m_hOCI.pLdaDef = pLda_Def;
	m_hOCI.bLdaDefInit = TRUE;

	//成功,返回
	return GW_SUCCESS;
}

//登录函数
//Paramer:
//        char *pszHost       [in]   //数据库服务名
//        char *pszPort       [in]   //端口号
//        char *pszUID        [in]   //用户名
//        char *pszPWD        [in]   //口令
//        bool bVersion       [in]   //如果当前的数据库是8.0.4以上,则为true,否则为false
//如果成功登录oracle数据库,则返回0,否则返回非0
int COraBase::OCILogin(char *pszHost, char *pszPort, char *pszUID, char *pszPWD, bool bVersion)
{
	if(bVersion)
		return OCILogin(pszHost, pszPort, pszUID, pszPWD);
	else
		return OCILogin(pszHost, pszUID, pszPWD);
}

//初始化OCI的环境
int COraBase::OCIInit()
{
	//初始化环境
	int rc = 0;
	rc = OCIInitialize((ub4) OCI_DEFAULT,                           /* 采用默认的初始化模式*/  
		               (dvoid *)0,                                  /* 采用默认的上下文内存回调函数*/
                       (dvoid * (*)(dvoid *, size_t)) 0,            /* 默认的内存分配回调函数*/
                       (dvoid * (*)(dvoid *, dvoid *, size_t))0,    /* 默认的内存重新分配回调函数*/
                       (void (*)(dvoid *, dvoid *)) 0 );            /* 默认的内存释放回调函数*/	
	if(OCI_SUCCESS != rc)
		return ERR_OCI_INIT_8I;  //无法初始化OCI环境

	//分配并初始化环境句柄
	rc = OCIEnvInit((OCIEnv **) &(m_hOCI.phEnv),  /* 环境句柄*/ 
		            (ub4) OCI_DEFAULT,            /* 采用默认的环境句柄分配方式,也就是互斥的*/
                    (size_t) 0,                   /* */
				    (dvoid **) 0);                /* */
	if((OCI_SUCCESS != rc) && (OCI_SUCCESS_WITH_INFO != rc))
		return ERR_OCI_ENV_8I;
	else 
		m_hOCI.bEnvInit = true;

	//分配并初始化服务句柄
	rc = OCIHandleAlloc((dvoid *)m_hOCI.phEnv,
		                (dvoid **)&(m_hOCI.phService),
						(ub4)OCI_HTYPE_SVCCTX,
						(size_t) 0, 
						(dvoid **) 0);
	if(OCI_SUCCESS != rc)
	{
		//释放环境句柄
		OCIHandleFree((dvoid *)m_hOCI.phEnv, OCI_HTYPE_ENV); 
		m_hOCI.phEnv = NULL;
		m_hOCI.bEnvInit = false;
		return ERR_OCI_SVC_8I;
	}
	else
		m_hOCI.bSvcInit = true;

	//分配错误句柄
	rc = OCIHandleAlloc((dvoid *)m_hOCI.phEnv,
		                (dvoid **)&(m_hOCI.phErr),
						(ub4)OCI_HTYPE_ERROR ,
						(size_t) 0, 
						(dvoid **) 0);
	if(OCI_SUCCESS != rc)
	{
		//释放服务句柄
		OCIHandleFree((dvoid *)m_hOCI.phService, OCI_HTYPE_SVCCTX); 
		m_hOCI.phService = NULL;
		m_hOCI.bSvcInit = false;

		//释放环境句柄
		OCIHandleFree((dvoid *)m_hOCI.phEnv, OCI_HTYPE_ENV); 
		m_hOCI.phEnv = NULL;
		m_hOCI.bEnvInit = false;

		return ERR_OCI_ERRH_8I;
	}
	else
		m_hOCI.bErrInit = true;

	//分配并初始化语句句柄
	rc = OCIHandleAlloc((dvoid *)m_hOCI.phEnv,
		                (dvoid **)&(m_hOCI.phStmt),
						(ub4)OCI_HTYPE_STMT,
						(size_t) 0, 
						(dvoid **) 0);
	if(OCI_SUCCESS != rc)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -