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

📄 wtrecordset.cpp

📁 将对Oracle数据库读写操作的OCI进行封装。不但具有普通数据的读取操作
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		if(status != OCI_SUCCESS)
		{
			m_pError->m_status = status;
			return FALSE;
		}

		//读取参数类型
		status = OCIAttrGet(m_phCol,OCI_DTYPE_PARAM,&m_colType[i],
			0,OCI_ATTR_DATA_TYPE,m_pError->m_pherr);
		if(status != OCI_SUCCESS)
		{
			m_pError->m_status = status;
			return FALSE;
		}

		//读取参数长度
		status = OCIAttrGet(m_phCol,OCI_DTYPE_PARAM,&colLen[i],
			0,OCI_ATTR_DATA_SIZE,m_pError->m_pherr);
		if(status != OCI_SUCCESS)
		{
			m_pError->m_status = status;
			return FALSE;
		}

		int nLen = 0;
		int nPre = 0;

		switch(m_colType[i])
		{
		case SQLT_NUM:
		case SQLT_INT:
		case SQLT_FLT:
		case SQLT_LNG:
		case SQLT_UIN:
			//读取长度
			nLen = 0;
			status = OCIAttrGet(m_phCol,OCI_DTYPE_PARAM,&nLen,
				0,OCI_ATTR_PRECISION,m_pError->m_pherr);
			if(status != OCI_SUCCESS)
			{
				m_pError->m_status = status;
				return FALSE;
			}
			m_colLen[i] = nLen;

			//读取精度
			nPre = 0;
			status = OCIAttrGet(m_phCol,OCI_DTYPE_PARAM,&nPre,
				0,OCI_ATTR_SCALE,m_pError->m_pherr);
			if(status != OCI_SUCCESS)
			{
				m_pError->m_status = status;
				return FALSE;
			}
			m_colPrecision[i] = nPre;
			break;

		case SQLT_DAT:
			m_colLen[i] = 100;
			m_colPrecision[i] = 0;
			break;

		case SQLT_CHR:
		case SQLT_STR:
			//读取参数长度 char*
			status = OCIAttrGet(m_phCol,OCI_DTYPE_PARAM,&m_colLen[i],
				0,OCI_ATTR_DATA_SIZE,m_pError->m_pherr);
			if(status != OCI_SUCCESS)
			{
				m_pError->m_status = status;
				return FALSE;
			}
			m_colPrecision[i] = 0;
			break;

		default:
			m_colLen[i] = 0;
			m_colPrecision[i] = 0;
			break;
		}

		//如果是日期参数
		if(m_colType[i] == SQLT_DAT)
		{
			//字段长度为 30
			m_colLen[i] = 30;
		}

		if(m_colType[i] == SQLT_NTY)
		{//如果参数是GEO类型
		}
		else
		{
			//分配用来保存当前字段数据的缓冲区
			m_colBuf[i] = (text *) new text[(int)colLen[i] + 1];
		}

		//读取字段名
		status = OCIAttrGet(m_phCol,OCI_DTYPE_PARAM,(dvoid *)&pFieldName,
			(ub4 *)&size,OCI_ATTR_NAME,m_pError->m_pherr);
		if(status != OCI_SUCCESS)
		{
			m_pError->m_status = status;
			return FALSE;
		}

		//保存字段名
		strncpy((char *)tempText,(char *)pFieldName,(size_t)size);
		tempText[size] = '\0';
		m_strColName[i].Format("%s",tempText);
	}

	for(i = 0;i < nColumnNum;i++)
	{
		if(m_colType[i] == SQLT_NTY)
		{
			static OCIType      *geomtdo = GetTdo(SDO_GEOMETRY);

			//定义变量
			status = OCIDefineByPos(m_phstmt, &m_phdef[i], m_pError->m_pherr, (ub4)i + 1,
				(dvoid *)0, 
				(sb4)0, SQLT_NTY,
				(dvoid *)0,(ub2 *)0, (ub2 *)0, (ub4)OCI_DEFAULT);
			if(status != OCI_SUCCESS)
			{
				m_pError->m_status = status;
				return FALSE;
			}

			status = OCIDefineObject(m_phdef[i], m_pError->m_pherr, geomtdo, 
				(dvoid **)&m_ptagGeo, (ub4 *)0, 
				(dvoid **)0, (ub4 *)0);
			if(status != OCI_SUCCESS)
			{
				m_pError->m_status = status;
				return FALSE;
			}
		}
		else
		{
			if(m_colType[i] == SQLT_DAT)
			{
				//定义变量
				status = OCIDefineByPos(m_phstmt,&m_phdef[i],m_pError->m_pherr,i + 1,(OCIDate *)&m_ociDate[i],
					7,SQLT_ODT,0,0,0,OCI_DEFAULT);//SQLT_DAT
				if(status != OCI_SUCCESS)
				{
					m_pError->m_status = status;
					return FALSE;
				}
			}
			else
			{
				//定义变量:用来接收某一字段(第 i + 1 字段)的数据,保存于 m_colBuf[i] 缓冲区中
				status = OCIDefineByPos(m_phstmt,&m_phdef[i],m_pError->m_pherr,i + 1,(ub1 *)m_colBuf[i],
					colLen[i] + 1,SQLT_STR,&m_ind[i],0,0,OCI_DEFAULT);
				if(status != OCI_SUCCESS)
				{
					m_pError->m_status = status;
					return FALSE;
				}
			}
		}
	}

	return TRUE;
}

BOOL CWTRecordSet::SaveData()
{
	long       nRow    = 0;
	sword      status  = 0;
	CString    strTemp = _T("");
	CWTField  *pField  = NULL;
	CWTRecord *pRecord = NULL;

	//读取一条记录
	while((OCIStmtFetch(m_phstmt,m_pError->m_pherr,1,OCI_FETCH_NEXT,OCI_DEFAULT)) != OCI_NO_DATA)
	{
		//创建一个记录对象
		pRecord = new CWTRecord();
		pRecord->m_FieldCount = m_FieldCount;
		nRow++;

		for(int i = 0; i < m_FieldCount;i++)
		{
			//创建一个字段对象
			pField = new CWTField();

			switch(m_colType[i])
			{
			case SQLT_DAT:
				{
					pField->SetValueType(CWTValue::WTDATE);

					uword invalid = 0;

					//检验日期格式是否正确
					status = OCIDateCheck(m_pError->m_pherr,&m_ociDate[i],&invalid);
					if(status != OCI_SUCCESS)
					{
						m_pError->m_status = status;
						return FALSE;
					}

					sb2 year  = 0;
					ub1 month = 0;
					ub1 day   = 0;
					year  = m_ociDate[i].OCIDateYYYY;
					month = m_ociDate[i].OCIDateMM;
					day   = m_ociDate[i].OCIDateDD;

					if(status != OCI_SUCCESS)
					{
						m_pError->m_status = status;
						return FALSE;
					}

					if(day < 10)
					{
						if(month < 10)
							strTemp.Format("0%d-0%d-%d",day,month,year);
						else
							strTemp.Format("0%d-%d-%d",day,month,year);
					}
					else
						if(month < 10)
							strTemp.Format("%d-0%d-%d",day,month,year);
						else
							strTemp.Format("%d-%d-%d",day,month,year);

					*pField = strTemp;//保存数据
				}
				break;
			case SQLT_CHR:
			case SQLT_STR:
				{
					pField->SetValueType(CWTValue::WTCSTRING);

					strTemp = m_colBuf[i];
					*pField = strTemp;

					pField->SetSize(m_colLen[i]);
				}
				break;
			case SQLT_NTY:
				{
					//初始化 geo 字段
					pField->SetValueType(CWTValue::WTOBJECT);

					if(m_ptagGeo != NULL)
					{
						//保存 geo 数据
					    this->OCIToC(*m_ptagGeo,pField->m_CGeotry);
					}
				}
				break;
			case SQLT_UIN:
			case SQLT_INT:
				{
					pField->SetValueType(CWTValue::WTINT);
					strTemp = m_colBuf[i];
					int nValue = (int) atoi(strTemp);
					*pField = nValue;
					pField->SetPrecision(m_colPrecision[i]);
					pField->SetSize(m_colLen[i]);
				}
				break;
			case SQLT_LNG:
				{
					pField->SetValueType(CWTValue::WTLONG);
					strTemp = m_colBuf[i];
					long lValue = (long) atol(strTemp);
					*pField = lValue;
					pField->SetPrecision(m_colPrecision[i]);
					pField->SetSize(m_colLen[i]);
				}
				break;
			case SQLT_FLT:
				{
					pField->SetValueType( CWTValue::WTDOUBLE);
					strTemp = m_colBuf[i];
					double dlValue = (double) atof(strTemp);
					*pField = dlValue;
					pField->SetPrecision(m_colPrecision[i]);
					pField->SetSize(m_colLen[i]);
				}
				break;
			case SQLT_NUM:
				{
					if(m_colPrecision[i] > 0)
					{
						if(m_colLen[i] <= 7)
						{
							pField->SetValueType(CWTValue::WTFLOAT);
							strTemp = m_colBuf[i];
							float flValue =  (float)atof(strTemp);
							*pField = flValue;
						}
						else
						{
							pField->SetValueType(CWTValue::WTDOUBLE);
							strTemp = m_colBuf[i];
							double dlValue = (double) atof(strTemp);
							*pField = dlValue;
						}
					}
					else
					{
						if(m_colLen[i] <= 4)
						{
							pField->SetValueType(CWTValue::WTINT);
							strTemp = m_colBuf[i];
							int nValue = (int) atoi(strTemp);
							*pField = nValue;
						}
						else
						{
							pField->SetValueType(CWTValue::WTLONG);
							strTemp = m_colBuf[i];
							long lValue = (long) atol(strTemp);
							*pField = lValue;
						}
					}
					pField->SetPrecision(m_colPrecision[i]);
					pField->SetSize(m_colLen[i]);
				}
				break;
			default:
				{
					pField->SetValueType( CWTValue::WTCSTRING);
					strTemp = m_colBuf[i];
					*pField = strTemp;
					pField->SetPrecision(0);
					pField->SetSize(0);
				}
				break;
			}

			//保存字段名
			pField->SetFieldName(m_strColName[i]);

			//保存字段
			pRecord->Fields().Add(pField);
		}

		//保存记录
		Records().Add(pRecord);
	}

	CWTRecordSet::m_RecordCount = nRow;

	//释放缓冲区
	for(int i = 0;i < m_FieldCount;i++)
	{
		if(m_colType[i] != SQLT_NTY)
		{
			delete m_colBuf[i];
		}
	}
	
	if(m_ptagGeo != NULL)
	{
		//释放对象
		OCIObjectFree(m_pDataBase->m_phenv,
			m_pError->m_pherr,
			(dvoid *)m_ptagGeo, 
			(ub2)OCI_OBJECTFREE_FORCE);
		m_ptagGeo = NULL;
	}

	return TRUE;
}

⌨️ 快捷键说明

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