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

📄 wtcommander.cpp

📁 将对Oracle数据库读写操作的OCI进行封装。不但具有普通数据的读取操作
💻 CPP
字号:
/*
* 文件名:  WTCommander.cpp
*        
* 作者:    施立虹
*     
* 描述:    用来对 oracle 数据库数据进行增、删、改等操作!
*     
* 全局变量:无
*          
* 修订记录:
*     日期            修订者           修订描述
*     2004-06-16      施立虹          创建本文件
*/

// WTCommander.cpp: implementation of the CWTCommander class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "WTCommander.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CWTCommander::CWTCommander()
{
}

CWTCommander::~CWTCommander()
{

}

void CWTCommander::Reset()
{
	m_strSQL = _T("");
}

/*
* 函数名称: SetCommand
* 编写者:   施立虹 
* 功能:     设置sql命令
* 输入参数: lpszSQL
* 输出参数: 
* 返回值:   TRUE 或 FALSE
* 注意事项: 
* 修订记录:
*     日期            修订者           修订描述
*    2004-06-16       施立虹           创建
*/
BOOL CWTCommander::SetCommand(LPCSTR lpszSQL)
{
	m_strSQL = lpszSQL;
	return TRUE;
}

/*
* 函数名称: Execute
* 编写者:   施立虹 
* 功能:     执行sql命令
* 输入参数: 
* 输出参数: 
* 返回值:   TRUE 或 FALSE
* 注意事项: 
* 修订记录:
*     日期            修订者           修订描述
*    2004-06-16       施立虹           创建
*/
BOOL CWTCommander::Execute()
{
    long i = 0;
	int interpretation = 1;
	sword status = 0;

	//用来绑定空间数据的点元素数组和几何信息数据
	OCIBind *bnd1p = NULL, *bnd2p = NULL;

	//存放SQL语句
	char query[1024] = {0};

	static CWTValue::sdo_elem_info_array *elem_info;//空间数据"几何体元素信息"数组
	static CWTValue::sdo_ordinate_array *ordinates;//空间数据"点元素"数组
	static OCIType  *elem_info_tdo = NULL;     
	static OCIType  *ordinates_tdo = NULL;

	static CWTValue::SDOGEOMETRY  object;
	static CWTValue::SDOGEOMETRY *pObject = NULL;
	pObject = &object;

	static OCIType  *geo_tdo = NULL;     

	geo_tdo = GetTdo(SDO_GEOMETRY);

	//语句句柄
	OCIStmt 	*stmthp2;
	status = OCIHandleAlloc((dvoid *)m_pDataBase->m_phenv, (dvoid **)&stmthp2, OCI_HTYPE_STMT, 0,0);//分配语句句柄
	
	sprintf(query, "%s",m_strSQL);
	status = OCIStmtPrepare(stmthp2, m_pError->m_pherr, 
	    (text *)query, (ub4)strlen((char *)query), 
	    (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT);
	if(status != OCI_SUCCESS)
	{
		m_pError->m_status = status;
		return FALSE;
	}

	if(m_listParams.GetSize() > 0)
	{
		//读取对象的数据类型
		elem_info_tdo = GetTdo(SDO_ELEM_INFO_ARRAY);
		ordinates_tdo = GetTdo(SDO_ORDINATE_ARRAY);

		//创建两个新对象
		status = OCIObjectNew(m_pDataBase->m_phenv, m_pError->m_pherr, m_pDataBase->m_phsvc, OCI_TYPECODE_VARRAY,
			elem_info_tdo, (dvoid *)NULL, 
			OCI_DURATION_SESSION,
			FALSE, (dvoid **)&pObject->sdoElemInfo);
		if(status != OCI_SUCCESS)
		{
			m_pError->m_status = status;
			return FALSE;
		}

		//创建对象
		status = OCIObjectNew(m_pDataBase->m_phenv, m_pError->m_pherr, m_pDataBase->m_phsvc, OCI_TYPECODE_VARRAY,
			ordinates_tdo, (dvoid *)NULL, 
			OCI_DURATION_SESSION,
			FALSE, (dvoid **)&pObject->sdoOrdinates);
		if(status != OCI_SUCCESS)
		{
			m_pError->m_status = status;
			return FALSE;
		}

//		int      nVal[512] = {0};
		float    flVal[512] = {0};
		text    *TextVal[512] = {0};
		CWTParameter *pParamter = NULL;

		//获取输入参数
		for(int i = 0;i < m_listParams.GetSize();i++)
		{
			pParamter = m_listParams.GetAt(i);

			text   TextMrak[512] = {0};
			wsprintf((char *)TextMrak,"%s",pParamter->GetMark());

			CWTValue::ValType valType = pParamter->GetValueType();
			switch(valType)
			{
			case CWTValue::WTINT:
			case CWTValue::WTLONG:
/*				{
					nVal[i] = (int)pParamter->m_dlVal;

					status = OCIBindByName(m_phstmt, 
						&pParamter->m_phbid, 
						pError->m_pherr, 
						(text *)TextMark,
						-1,
						(int *)&nVal[i], 
						sizeof(nVal[i]),
						SQLT_INT,
						0, 0, 0, 0, 0,
						OCI_DEFAULT);

					status = OCIBindByName(m_phstmt, 
						&pParamter->m_phbid, 
						pError->m_pherr, 
						(text *)TextMark,
						-1,
						(int *)&nVal[i], 
						sizeof(nVal[i]),
						SQLT_INT,
						0, 0, 0, 0, 0,
						OCI_DEFAULT);
					if(status != OCI_SUCCESS)
					{
						pError->m_status = status;
						return FALSE;
					}
				}
*/
			case CWTValue::WTFLOAT:
			case CWTValue::WTDOUBLE:
				{
					sword     status = 0;
					flVal[i] = (float)pParamter->m_dlVal;

					//绑定变量
					status = OCIBindByName(stmthp2, 
						&pParamter->m_phbid, 
						m_pError->m_pherr, 
						(text *)TextMrak,
						-1,
						(float *)&flVal[i], 
						sizeof(flVal[i]),
						SQLT_FLT,
						0, 0, 0, 0, 0,
						OCI_DEFAULT);
					if(status != OCI_SUCCESS)
					{
						m_pError->m_status = status;
						return FALSE;
					}
				}
				break;
			case CWTValue::WTDATE:
			case CWTValue::WTCSTRING:
				{
					int    nLen = 0;
					sword  status = 0;
					nLen = pParamter->m_strVal.GetLength();
					TextVal[i] = new text[nLen + 1];

					wsprintf((char *)TextVal[i],"%s",pParamter->m_strVal);
					TextVal[i][nLen] = '\0';
					nLen += 1;

					//绑定变量
					status = OCIBindByName(stmthp2, &pParamter->m_phbid, m_pError->m_pherr, 
						(text *)TextMrak, -1,
						(ub1 *)TextVal[i], nLen + 1,
						SQLT_STR,
						0, 0, 0, 0, 0,
						OCI_DEFAULT);
					if(status != OCI_SUCCESS)
					{
						m_pError->m_status = status;
						return FALSE;
					}
				}
				break;
			case CWTValue::WTOBJECT:
				{
					//转换成空间数据
					if(!CToOCI(*pObject,pParamter->m_CGeotry))
					{
					};

					//绑定变量
					status = OCIBindByName(stmthp2, &bnd2p, m_pError->m_pherr, 
						(text *)TextMrak, (sb4)-1, (dvoid *)0, 
						(sb4)0, SQLT_NTY, (dvoid *)0, (ub2 *)0, 
						(ub2 *)0, (ub4)0, (ub4 *)0, 
						(ub4)OCI_DEFAULT);
					if(status != OCI_SUCCESS)
					{
						m_pError->m_status = status;
						return FALSE;
					}

					//绑定对象
					status = OCIBindObject(bnd2p, m_pError->m_pherr, geo_tdo, 
						(dvoid **)&pObject, (ub4 *)0, 
						(dvoid **)0, (ub4 *)0);
					if(status != OCI_SUCCESS)
					{
						m_pError->m_status = status;
						return FALSE;
					}
				}
				break;
			default:
				{
				}
				break;
			}
		}

		//执行 sql 语句
		status = OCIStmtExecute(m_pDataBase->m_phsvc,stmthp2,m_pError->m_pherr,
								(ub4)1,0,NULL,NULL,OCI_DEFAULT);
		if(status == OCI_ERROR)
		{
			m_pError->m_status = status;
			return FALSE;
		}

		//提交
		status = OCITransCommit(m_pDataBase->m_phsvc,m_pError->m_pherr,(ub4)0);
		if(status == OCI_ERROR)
		{
			m_pError->m_status = status;
			return FALSE;
		}

		for(i = 0 ;i < 512 ;i++)
		{
			if(TextVal[i] != 0)
			{
				delete TextVal[i];
				TextVal[i] = 0;
			}
		}

		//释放对象
		OCIObjectFree(m_pDataBase->m_phenv, m_pError->m_pherr, 
                		 (dvoid *)pObject->sdoOrdinates, 
						 (ub2)OCI_OBJECTFREE_FORCE);

		//释放对象
		OCIObjectFree(m_pDataBase->m_phenv, m_pError->m_pherr, 
			             (dvoid *)pObject->sdoElemInfo, 
						 (ub2)OCI_OBJECTFREE_FORCE);

		//释放语句句柄
		OCIHandleFree((dvoid *)stmthp2, (ub4)OCI_HTYPE_STMT);
		return TRUE;
	}

	//执行sql 语句
	status = OCIStmtExecute(m_pDataBase->m_phsvc,stmthp2,m_pError->m_pherr,
		                    (ub4)1,0,NULL,NULL,OCI_DEFAULT);
	if(status != OCI_SUCCESS)
	{
		m_pError->m_status = status;
		return FALSE;
	}

	//提交
	status = OCITransCommit(m_pDataBase->m_phsvc,m_pError->m_pherr,(ub4)0);
	if(status != OCI_SUCCESS)
	{
		m_pError->m_status = status;
		return FALSE;
	}

	//释放语句句柄
	OCIHandleFree((dvoid *)stmthp2, (ub4)OCI_HTYPE_STMT);

	return TRUE;
}

⌨️ 快捷键说明

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