📄 orabase.cpp
字号:
// 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 + -