📄 jy_ociconn.cpp
字号:
#include "stdafx.h"
#include "jy_oci.h"
#include <string>
using namespace std;
COciConnection::COciConnection()
{
connected = FALSE;
m_envhp = 0;
m_errhp = 0;
m_srvhp = 0;
m_svchp = 0;
m_usrhp = 0;
m_dschp = 0;
m_txnhp = 0;
}
bool COciConnection::Connect(const char* dblink,
const char* username, const char* password)
{
sword status;
int mode = OCI_THREADED|OCI_OBJECT;
OCIInitialize((ub4)mode, (dvoid *)0,
(dvoid*(*)(dvoid *ctxp, size_t size))0,
(dvoid*(*)(dvoid *ctxp, dvoid *memptr, size_t newsize))0,
(void (*)(dvoid *ctxp, dvoid *memptr))0);
// 初始化环境句柄
OCIEnvInit(&m_envhp, (ub4)OCI_DEFAULT, (size_t)0, (dvoid**)0);
//
OCIHandleAlloc((dvoid*)m_envhp, (dvoid**)&m_errhp, (ub4)OCI_HTYPE_ERROR,
(size_t)0, (dvoid**)0);
OCIHandleAlloc((dvoid*)m_envhp, (dvoid**)&m_srvhp, (ub4)OCI_HTYPE_SERVER,
(size_t)0, (dvoid**)0);
status = OCIServerAttach(m_srvhp, m_errhp, (text*)dblink,
(sb4)strlen(dblink), (ub4)OCI_DEFAULT);
if (status != OCI_SUCCESS)
return FALSE;
//
OCIHandleAlloc((dvoid*)m_envhp, (dvoid**)&m_svchp, (ub4)OCI_HTYPE_SVCCTX,
(size_t)0, (dvoid**)0);
OCIAttrSet((dvoid*)m_svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid*)m_srvhp, (ub4)0,
(ub4)OCI_ATTR_SERVER, m_errhp);
//
OCIHandleAlloc((dvoid*)m_envhp, (dvoid**)&m_usrhp, (ub4)OCI_HTYPE_SESSION,
(size_t)0, (dvoid**)0);
OCIAttrSet((dvoid*)m_usrhp, (ub4)OCI_HTYPE_SESSION, (dvoid*)username,
(ub4)strlen(username), (ub4)OCI_ATTR_USERNAME, m_errhp);
OCIAttrSet((dvoid*)m_usrhp, (ub4)OCI_HTYPE_SESSION, (dvoid*)password,
(ub4)strlen(password), (ub4)OCI_ATTR_PASSWORD, m_errhp);
// 初始化描述句柄
OCIHandleAlloc((dvoid*)m_envhp, (dvoid**)&m_dschp,
(ub4)OCI_HTYPE_DESCRIBE, (size_t)0, (dvoid **)0);
// 开始会话
status = OCISessionBegin(m_svchp, m_errhp, m_usrhp, OCI_CRED_RDBMS,
OCI_DEFAULT);
// 检查错误
COciException::checkErr(m_errhp, status);
if (status != OCI_SUCCESS)
return FALSE;
OCIAttrSet((dvoid*)m_svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid*)m_usrhp, (ub4)0,
(ub4)OCI_ATTR_SESSION, m_errhp);
// 分配事务句柄
OCIHandleAlloc((dvoid *)m_envhp, (dvoid **)&m_txnhp, OCI_HTYPE_TRANS, 0, 0);
OCIAttrSet((dvoid *)m_svchp, OCI_HTYPE_SVCCTX, (dvoid *)m_txnhp, 0,
OCI_ATTR_TRANS, m_errhp);
connected = true;
return true;
}
void COciConnection::Disconnect()
{
if (connected)
{
// 结束会话
OCISessionEnd(m_svchp, m_errhp, m_usrhp, (ub4)OCI_DEFAULT);
OCIServerDetach(m_srvhp, m_errhp, (ub4)OCI_DEFAULT);
// 释放句柄
OCIHandleFree((dvoid*)m_txnhp, (ub4)OCI_HTYPE_TRANS);
OCIHandleFree((dvoid*)m_srvhp, (ub4)OCI_HTYPE_SERVER);
OCIHandleFree((dvoid*)m_svchp, (ub4)OCI_HTYPE_SVCCTX);
OCIHandleFree((dvoid*)m_errhp, (ub4)OCI_HTYPE_ERROR);
OCIHandleFree((dvoid *)m_dschp, (ub4)OCI_HTYPE_DESCRIBE);
connected = false;
m_envhp = 0;
m_errhp = 0;
m_srvhp = 0;
m_svchp = 0;
m_usrhp = 0;
m_dschp = 0;
m_txnhp = 0;
}
}
//HYConnPool的实现
//初始化静态成员
COciConnPool* COciConnPool::m_pool = NULL;
COciConnPool::COciConnPool()
{
m_conns.resize(MAX_CONN);
for (int i=0; i<MAX_CONN; i++)
{
m_conns[i] = new COciConnection();
}
}
COciConnPool::~COciConnPool()
{
for (size_t i=0; i<=m_conns.size()-1; i++)
{
if (m_conns[i]) delete m_conns[i];
m_conns[i] = NULL;
}
}
COciConnPool* COciConnPool::CreatePool()
{
if (m_pool == NULL)
{
m_pool = new COciConnPool;
}
return m_pool;
}
COciConnection* COciConnPool::GetConn()
{
for (size_t i=0; i<=m_conns.size()-1; i++)
{
if (!m_conns[i]->IsConnected())
{
return m_conns[i];
}
}
return NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -