📄 wtrecordset.cpp
字号:
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 + -