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

📄 wtcommand.cpp

📁 将对Oracle数据库读写操作的OCI进行封装。不但具有普通数据的读取操作
💻 CPP
字号:
// WTCommand.cpp: implementation of the CWTCommand class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "WTCommand.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CWTValue::SDOGEOMETRY *CWTCommand::m_ptagGeo = NULL;

CWTCommand::CWTCommand()
{
	m_bCreate = FALSE;
}

CWTCommand::~CWTCommand()
{

}

OCIType *CWTCommand::GetTdo(char *szTypeName)
{
	sword status = 0;
	OCIRef *type_ref = NULL;
	OCIParam *paramp = NULL;
	OCIType *tdo = NULL;

	status = OCIDescribeAny(m_pDataBase->m_phsvc, m_pError->m_pherr, 
		(text *)szTypeName, (ub4)strlen((char *)szTypeName), OCI_OTYPE_NAME, 
		(ub1)OCI_DEFAULT,(ub1)OCI_PTYPE_TYPE, m_phDsc);
	if(status != OCI_SUCCESS)
	{
		m_pError->m_status = status;
		return FALSE;
	}

	//读取 dschp 的参数符
	status = OCIAttrGet((dvoid *)m_phDsc, (ub4)OCI_HTYPE_DESCRIBE,
	    (dvoid *)&paramp, (ub4 *)0, 
	    (ub4)OCI_ATTR_PARAM, m_pError->m_pherr);
	if(status != OCI_SUCCESS)
	{
		m_pError->m_status = status;
		return FALSE;
	}

	//读取 OCI object REFerence
	status = OCIAttrGet((dvoid *)paramp, (ub4)OCI_DTYPE_PARAM,
	    (dvoid *)&type_ref, (ub4 *)0, 
	    (ub4)OCI_ATTR_REF_TDO, m_pError->m_pherr);
	if(status != OCI_SUCCESS)
	{
		m_pError->m_status = status;
		return FALSE;
	}

	status = OCIObjectPin(m_pDataBase->m_phenv, m_pError->m_pherr, type_ref, (OCIComplexObject *)0, 
	    OCI_PIN_ANY, OCI_DURATION_SESSION, 
	    OCI_LOCK_NONE, (dvoid **)&tdo);
	if(status != OCI_SUCCESS)
	{
		m_pError->m_status = status;
		return FALSE;
	}

	if (!tdo)
	{
		return NULL; 
	}

	return tdo;
}

BOOL CWTCommand::Create(CWTDataBase* pDB,CWTError *pError)
{
	if(TRUE == m_bCreate)
	{
		return TRUE;
	}
	m_pDataBase = pDB;
	m_pError = pError;

	unsigned int status = 0;
	
	//分配语句句柄
	status = OCIHandleAlloc((dvoid *)m_pDataBase->m_phenv, (dvoid **)&m_phstmt,
		OCI_HTYPE_STMT, 0,0);
	if(status == OCI_ERROR)
	{
		return FALSE;
	}

	//分配描述句柄
	status = OCIHandleAlloc((dvoid *)m_pDataBase->m_phenv, (dvoid **)&m_phDsc,
		OCI_HTYPE_DESCRIBE, 0,0);
	if(status == OCI_ERROR)
	{
		return FALSE;
	}

	m_geomtdo = GetTdo(SDO_GEOMETRY);

	m_bCreate = TRUE;
	return TRUE;
}

void CWTCommand::Release()
{
	if(m_bCreate == FALSE)
		return;

	//释放语句句柄
	if(	m_phstmt != NULL)
	{
		OCIHandleFree((dvoid *)m_phstmt, (ub4)OCI_HTYPE_STMT);
		m_phstmt = NULL;
	}

	//释放描述句柄
	if(	m_phDsc != NULL)
	{
		OCIHandleFree((dvoid *)m_phDsc, (ub4)OCI_HTYPE_DESCRIBE);
		m_phDsc = NULL;
	}
	m_bCreate = FALSE;
}

BOOL CWTCommand::CToOCI(CWTValue::SDOGEOMETRY& tagObject,const CGeometry& cGeom)
{
	int nTemp = 0;
	double dlTemp = 0;

    sword status = 0;
	OCINumber oci_number;//声明Oracle 里的Number类型

	//数据转换
	status = OCINumberFromInt(m_pError->m_pherr, (dvoid *)&cGeom.m_nType,
	    (uword)sizeof(ub4), OCI_NUMBER_UNSIGNED, 
	    &tagObject.sdoGtype);//OCINumber: tagObject.sdoGtype
	if(status != OCI_SUCCESS)
	{
		m_pError->m_status = status;
	    return FALSE;
	}

	//数据转换
	status = OCINumberFromInt(m_pError->m_pherr, (dvoid *)&cGeom.m_nID,
	    (uword)sizeof(ub4), OCI_NUMBER_UNSIGNED, 
	    &tagObject.sdoSrid);
	if(status != OCI_SUCCESS)
	{
		m_pError->m_status = status;
	    return FALSE;
	}

	int countElems = cGeom.m_eleminfo.GetSize();
	int countOrds = cGeom.m_ordinates.GetSize();

	for(int i = 0; i < countElems; i++)
	{
		int nNum = cGeom.m_eleminfo[i];

		//数据转换
		status = OCINumberFromInt(m_pError->m_pherr, (dvoid *)&nNum,
		    (uword)sizeof(ub4),OCI_NUMBER_UNSIGNED,&oci_number);
		if(status != OCI_SUCCESS)
		{
			m_pError->m_status = status;
			return FALSE;
		}

		//保存转换好的数据
		status = OCICollAppend(m_pDataBase->m_phenv, m_pError->m_pherr,
		    (dvoid *) &oci_number,
		    (dvoid *)0, (OCIColl *)tagObject.sdoElemInfo);
		if(status != OCI_SUCCESS)
		{
			m_pError->m_status = status;
			return FALSE;
		}
	}

	for(i = 0; i < countOrds; i++)
	{
		double dlNum = cGeom.m_ordinates[i];

		//数据转换
		status = OCINumberFromReal(m_pError->m_pherr, (dvoid *)&dlNum,
		    (uword)sizeof(double),&oci_number);
		if(status != OCI_SUCCESS)
		{
			m_pError->m_status = status;
			return FALSE;
		}

		//保存转换好的数据
		status = OCICollAppend(m_pDataBase->m_phenv,m_pError->m_pherr,
		    (dvoid *) &oci_number,
		    (dvoid *)0, (OCIColl *)tagObject.sdoOrdinates);
		if(status != OCI_SUCCESS)
		{
			m_pError->m_status = status;
			return FALSE;
		}
	}

	return TRUE;
}

BOOL CWTCommand::OCIToC(const CWTValue::SDOGEOMETRY& OCIGeom,CGeometry& cGeom)
{
	int nOrdinate = 0;
	int nElem = 0;

    sword status = 0;
	status = OCINumberToInt(m_pError->m_pherr, &OCIGeom.sdoGtype,
			(uword)sizeof(int), OCI_NUMBER_SIGNED,
			(dvoid *)&cGeom.m_nType);
	if(status != OCI_SUCCESS)
	{
	    return FALSE;
	}

//
//	status = OCINumberToInt(m_pError->m_pherr, &OCIGeom.sdoSrid,
//			(uword)sizeof(int), OCI_NUMBER_SIGNED,
//			(dvoid *)&cGeom.m_nID);
//	if(status != OCI_SUCCESS)
//	{
//	    return FALSE;
//	}

	cGeom.m_nID = 2;

    status = OCICollSize(m_pDataBase->m_phenv, m_pError->m_pherr, 
	  	        (OCIColl *)(OCIGeom.sdoElemInfo), 
				&nElem);
	if(status != OCI_SUCCESS)
	{
	    return FALSE;
	}

    status = OCICollSize(m_pDataBase->m_phenv, m_pError->m_pherr, 
				(OCIColl *)(OCIGeom.sdoOrdinates), 
				&nOrdinate);
	if(status != OCI_SUCCESS)
	{
	    return FALSE;
	}

	int         col = 0;
	int         int_val    = 0;
	double      double_val = 0;
	boolean     exists;
	OCINumber  *oci_pNumber;

	for (col = 0; col < nOrdinate; col++)
	{
		status = OCICollGetElem(m_pDataBase->m_phenv, m_pError->m_pherr, 
			           (OCIColl *)(OCIGeom.sdoOrdinates), 
			           (sb4)col, (boolean *)&exists, 
			           (dvoid **)&oci_pNumber, (dvoid **)0);
		if(status != OCI_SUCCESS)
		{
			return FALSE;
		}


		status = OCINumberToReal(m_pError->m_pherr, oci_pNumber, (uword)sizeof(double),
			(dvoid *)&double_val);
		if(status != OCI_SUCCESS)
		{
			return FALSE;
		}
		cGeom.m_ordinates.Add(double_val);
	}

	for (col = 0; col < nElem; col++)
	{
		status = OCICollGetElem(m_pDataBase->m_phenv, m_pError->m_pherr, 
			           (OCIColl *)(OCIGeom.sdoElemInfo), 
			           (sb4)col, (boolean *)&exists, 
			           (dvoid **)&oci_pNumber, (dvoid **)0);
		if(status != OCI_SUCCESS)
		{
			return FALSE;
		}

		status = OCINumberToInt(m_pError->m_pherr, oci_pNumber, 
			           (uword)sizeof(int), OCI_NUMBER_SIGNED,
			           (dvoid *)&int_val);
		if(status != OCI_SUCCESS)
		{
			return FALSE;
		}

		cGeom.m_eleminfo.Add(int_val);
	}

	return TRUE;
}

⌨️ 快捷键说明

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