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

📄 ii_oracle.cpp

📁 ORACLE访问接口
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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 + -