📄 ii_oracle.cpp
字号:
break;
case IES_SQL_UINT:
t_nColType = SQLT_UIN;
t_nColSize = 4;
break;
case IES_SQL_FLOAT:
t_nColType = 4;
t_nColSize = 4;
break;
case IES_SQL_DOUBLE:
t_nColType = 4;
t_nColSize = 8;
break;
case IES_SQL_TIMESTAMP:
t_nColType = 12;
t_nColSize = 7;
break;
case IES_SQL_STRING:
t_nColType = 5;
t_nColSize = m_arCol[i].nSize;
break;
case IES_SQL_BINARY:
t_nColType = 24;
t_nColSize = m_arCol[i].nSize;
break;
default:
return false;
}
if(OCIDefineByPos(m_pStmtAll, &SelectDefineP[i], m_pErrHandle,
i+1, (dvoid*)m_arCol[i].pAddr, (sb4)t_nColSize,
(ub2)t_nColType, (dvoid*)0, (ub2*)0, (ub2*)0, (ub4)OCI_DEFAULT))
{
return false;
}
}
return true;
}
bool CIIOracleDBI::PassPara()
{
int t_nParaSize = 0;
int t_nParaType = 0;
char *tmpbuf;
STimeInfo t_TimeInfo;
for (int i = 0; i < m_arPara.GetNum(); i++)
{
switch(m_arPara[i].nType)
{
case IES_SQL_BOOL:
case IES_SQL_UTINYINT:
t_nParaType = SQLT_UIN;
t_nParaSize = 1;
break;
case IES_SQL_SMALLINT:
t_nParaType = SQLT_INT;
t_nParaSize = 2;
break;
case IES_SQL_USMALLINT:
t_nParaType = SQLT_UIN;
t_nParaSize = 2;
break;
case IES_SQL_INT:
t_nParaType = SQLT_INT;
t_nParaSize = 4;
break;
case IES_SQL_UINT:
t_nParaType = SQLT_UIN;
t_nParaSize = 4;
break;
case IES_SQL_FLOAT:
t_nParaType = 4;
t_nParaSize = 4;
break;
case IES_SQL_DOUBLE:
t_nParaType = 4;
t_nParaSize = 8;
break;
case IES_SQL_TIMESTAMP:
t_nParaType = 12;
t_nParaSize = 7;
//日期特殊处理
tmpbuf = new char[7]; //申请内存
memcpy(&t_TimeInfo, m_arPara[i].pAddr, sizeof(STimeInfo));
tmpbuf[0] = (char)(t_TimeInfo.nYear/100 + 100);
tmpbuf[1] = (char)(t_TimeInfo.nYear - (t_TimeInfo.nYear/100)* 100 +100);
tmpbuf[2] = (char)t_TimeInfo.nMonth;
tmpbuf[3] = (char)t_TimeInfo.nDay;
tmpbuf[4] = (char)t_TimeInfo.nHour + 1;
tmpbuf[5] = (char)t_TimeInfo.nMinute + 1;
tmpbuf[6] = (char)t_TimeInfo.nSecond + 1;
m_arPara[i].pAddr = tmpbuf;
m_bIsAllocParaMem = true; //设置分配内存标志
++m_nAllocParaCount;
break;
case IES_SQL_STRING:
t_nParaType = 5;
t_nParaSize = m_arPara[i].nSize;
break;
case IES_SQL_BINARY:
t_nParaType = 24;
t_nParaSize = m_arPara[i].nSize;
break;
default:
return false;
}
if (OCIBindByPos(m_pStmtAll, &ParamBindP[i], m_pErrHandle, i+1,
(dvoid*)m_arPara[i].pAddr, (sb4)t_nParaSize, (ub2)t_nParaType,
0, 0, 0, 0, 0, OCI_DEFAULT))
{
return false;
}
}
return true;
}
int CIIOracleDBI::Exec()
{
int nRet = 1;
if (OCIStmtPrepare(m_pStmtAll, m_pErrHandle, (text*)m_pszSql.GetBuf(),
(ub4)m_pszSql.GetLength(), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT ))
{
nRet = 0;
goto CLEAR;
}
if (!PassPara())
{
nRet = 0;
goto CLEAR;
}
if (m_nSqlType == 1) //如果是select语句
{
if (!PassCol())
{
nRet = 0;
goto CLEAR;
}
m_bIsFirst = true;
return 1;
}
if (OCIStmtExecute(m_pSvcHandle, m_pStmtAll, m_pErrHandle, (ub4)1,
(ub4)0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT))
{
nRet = 0;
goto CLEAR;
}
if (m_nSqlType == 2) //如果是Update语句
{
ub4 tRowCount = 0;
if (OCIAttrGet((dvoid *)m_pStmtAll,OCI_HTYPE_STMT,&tRowCount,
0,OCI_ATTR_ROW_COUNT, (OCIError *)m_pErrHandle))
{
nRet = 0;
goto CLEAR;
}
if (tRowCount == 0) //update 0 count
nRet = -1;
}
CLEAR:
//清空参数分配内存
if (m_bIsAllocParaMem)
{
ClearParaMem();
m_bIsAllocParaMem = false;
}
m_arPara.Empty(); //清空参数内容
return nRet;
}
bool CIIOracleDBI::Fetch()
{
sword ret;
SBind tBind;
unsigned char* t_pBuf;
STimeInfo pTime;
if (m_bIsFirst)
{
ret = OCIStmtExecute(m_pSvcHandle, m_pStmtAll, m_pErrHandle, (ub4)1,
(ub4)0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT);
m_bIsFirst = false;
}
else
{
ret = OCIStmtFetch(m_pStmtAll, m_pErrHandle, (ub4)1,
(ub4)OCI_FETCH_NEXT,(ub4)OCI_DEFAULT);
}
if (ret == OCI_NO_DATA)
{
m_bIsEnd = true;
return true;
}
else if (ret != OCI_SUCCESS && ret != OCI_SUCCESS_WITH_INFO)
return false;
m_bIsEnd = false;
//对日期和字符串类型作特殊处理
for (int i= 0; i< m_arCol.GetNum(); i++)
{
m_arCol.GetAt(i, tBind);
if (tBind.nType == IES_SQL_TIMESTAMP)
{
t_pBuf = (unsigned char*)tBind.pAddr;
pTime.nYear = (t_pBuf[0] - 100) * 100 + t_pBuf[1] - 100;
pTime.nMonth = t_pBuf[2];
pTime.nDay = t_pBuf[3];
pTime.nHour = t_pBuf[4] - 1;
pTime.nMinute = t_pBuf[5] - 1;
pTime.nSecond = t_pBuf[6] - 1;
memcpy(tBind.pAddr, &pTime, sizeof(STimeInfo));
}
}
return true;
}
void CIIOracleDBI::ClearParaMem()
{
for (int i=0; i<m_nAllocParaCount; i++)
{
if (m_arPara[i].nType == IES_SQL_TIMESTAMP)
delete [](char*)m_arPara[i].pAddr;
}
m_nAllocParaCount = 0;
}
bool CIIOracleDBI::BeginTrans()
{
if (OCITransStart(m_pSvcHandle, m_pErrHandle, 2, OCI_TRANS_READWRITE) == OCI_ERROR)
return false;
return true;
}
bool CIIOracleDBI::Commit()
{
if (OCITransCommit(m_pSvcHandle, m_pErrHandle, 0) == OCI_ERROR)
return false;
return true;
}
bool CIIOracleDBI::Rollback()
{
if (OCITransRollback(m_pSvcHandle, m_pErrHandle, 0) == OCI_ERROR)
return false;
return true;
}
//=======================================================================
// 接口实现
//=======================================================================
extern "C" void* ii_open(const char *i_pszSrv, const char*i_pszIpAddr,
const char *i_pszDBName, const char *i_pszUser, const char *i_pszPwd)
{
CIIOracleDBI *t_pDatabase = new CIIOracleDBI;
if (!t_pDatabase->Open(i_pszSrv, i_pszUser, i_pszPwd))
{
delete t_pDatabase;
return NULL;
}
return t_pDatabase;
}
extern "C" void ii_close(const void *i_pDatabase)
{
CIIOracleDBI *t_pDatabase = (CIIOracleDBI*)i_pDatabase;
t_pDatabase->Close();
if (t_pDatabase != NULL)
delete t_pDatabase;
}
extern "C" bool ii_execute_sql(const void *i_pDatabase, const char *i_pszSqlStr)
{
CIIOracleDBI *t_pDatabase = (CIIOracleDBI*)i_pDatabase;
return t_pDatabase->ExecuteSQL(i_pszSqlStr);
}
extern "C" bool ii_is_table_exist(const void *i_pDatabase, const char *i_szTableName)
{
CIIOracleDBI *t_pDatabase = (CIIOracleDBI*)i_pDatabase;
return t_pDatabase->IsTableExist(i_szTableName);
}
extern "C" bool ii_prepare_sql(const void *i_pDatabase, const char *i_pStringSQL)
{
CIIOracleDBI *t_pDatabase = (CIIOracleDBI*)i_pDatabase;
return t_pDatabase->PrepareSQL(i_pStringSQL);
}
extern "C" bool ii_bind_col(const void *i_pDatabase, int i_nColType,
int i_nColSize, void *i_pColAddr)
{
CIIOracleDBI *t_pDatabase = (CIIOracleDBI*)i_pDatabase;
return t_pDatabase->BindCol(i_nColType, i_nColSize, i_pColAddr);
}
extern "C" bool ii_bind_para(const void *i_pDatabase, int i_nParaType,
int i_nParaSize, void *i_pParaAddr)
{
CIIOracleDBI *t_pDatabase = (CIIOracleDBI*)i_pDatabase;
return t_pDatabase->BindPara(i_nParaType, i_nParaSize, i_pParaAddr);
}
extern "C" int ii_exec(const void *i_pDatabase)
{
CIIOracleDBI *t_pDatabase = (CIIOracleDBI*)i_pDatabase;
return t_pDatabase->Exec();
}
extern "C" bool ii_fetch(const void *i_pDatabase)
{
CIIOracleDBI *t_pDatabase = (CIIOracleDBI*)i_pDatabase;
return t_pDatabase->Fetch();
}
extern "C" bool ii_is_end(const void *i_pDatabase)
{
CIIOracleDBI *t_pDatabase = (CIIOracleDBI*)i_pDatabase;
return t_pDatabase->IsEnd();
}
extern "C" void ii_close_sql(const void *i_pDatabase, bool i_bCommit)
{
CIIOracleDBI *t_pDatabase = (CIIOracleDBI*)i_pDatabase;
t_pDatabase->CloseSQL();
}
extern "C" int ii_get_error_no(const void *i_pDatabase)
{
CIIOracleDBI *t_pDatabase = (CIIOracleDBI*)i_pDatabase;
return t_pDatabase->GetErrorNo();
}
extern "C" const char* ii_get_error_str(const void *i_pDatabase)
{
CIIOracleDBI *t_pDatabase = (CIIOracleDBI*)i_pDatabase;
return t_pDatabase->GetErrorStr();
}
extern "C" bool ii_begin_trans(const void *i_pDatabase)
{
CIIOracleDBI *t_pDatabase = (CIIOracleDBI*)i_pDatabase;
return t_pDatabase->BeginTrans();
}
extern "C" bool ii_commit(const void *i_pDatabase)
{
CIIOracleDBI *t_pDatabase = (CIIOracleDBI*)i_pDatabase;
return t_pDatabase->Commit();
}
extern "C" bool ii_rollback(const void *i_pDatabase)
{
CIIOracleDBI *t_pDatabase = (CIIOracleDBI*)i_pDatabase;
return t_pDatabase->Rollback();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -