📄 wtcommand.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 *)¶mp, (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 + -