📄 ocicursor.cpp
字号:
OCIParamGet((dvoid*)m_stmthp, (ub4)OCI_PTYPE_COL,
(OCIError *)m_conn->m_errhp, (dvoid**)&m_colhd, (ub4)colnumber)))
{
}
if (!COciException::checkErr(m_conn->m_errhp, OCIAttrGet((dvoid *)m_colhd, (ub4)OCI_DTYPE_PARAM,
(dvoid *)&tmpColsize, (ub4*)0, (ub4)OCI_ATTR_DATA_SIZE, (OCIError *)m_conn->m_errhp )))
{
}
return (tmpColsize);
}
//获取列值的小数位数
sb1 COciCursor::ColScale (int colnumber)
{
sb1 tmpColscale = (sb1) 0;
//得到第i列的参数
if (!COciException::checkErr(m_conn->m_errhp,
OCIParamGet((dvoid*)m_stmthp, (ub4)OCI_PTYPE_COL,
(OCIError *)m_conn->m_errhp, (dvoid**)&m_colhd, (ub4)colnumber)))
{
}
//获取第i列的具体属性
if (!COciException::checkErr(m_conn->m_errhp,
OCIAttrGet((dvoid *)m_colhd, (ub4)OCI_DTYPE_PARAM,
(dvoid *)&tmpColscale, (ub4*)0, (ub4)OCI_ATTR_SCALE, (OCIError *)m_conn->m_errhp )))
{
}
return (tmpColscale);
}
void COciCursor::SetColInfo(int colNum)
{
int i=colNum;
int coltype=0;
int colsize=0;
int colscale=0;
coltype = ColType(i);
colsize = ColSize(i);
colscale = ColScale(i);
m_col_type[i-1] = coltype;
m_col_size[i-1] = colsize;
m_col_scale[i-1] = colscale;
}
//为游标分配空间
bool COciCursor::AllocateCursor()
{
int coltype=0;
int numcols = NumCols();
m_defines.resize(numcols);
m_buffers.resize(numcols);
m_col_type.resize(numcols);
m_col_size.resize(numcols);
m_col_scale.resize(numcols);
m_ind.resize(numcols);
m_vp_lob.resize(numcols);
for(int i=1; i<=numcols;i++)
{
coltype = ColType(i);
switch (coltype)
{
case 3: //INTEGER
{
SetColInfo(i);
m_buffers[i-1] = new signed int;
int colsize = sizeof(signed int);
if (!COciException::checkErr(m_conn->m_errhp,
OCIDefineByPos(m_stmthp, &(m_defines[i-1]), m_conn->m_errhp, (ub4)i,
(dvoid *)(signed int*)m_buffers[i-1], (sb4)colsize, coltype,
(dvoid *)&m_ind[i-1], (ub2 *)0, (ub2 *)0,
(ub4)OCI_DEFAULT)))
throw COciException();
}
break;
case 2: //NUMBER
{
SetColInfo(i);
m_buffers[i-1] = (OCINumber *) new OCINumber; //();
if (!COciException::checkErr(m_conn->m_errhp,
OCIDefineByPos(m_stmthp, &(m_defines[i-1]), m_conn->m_errhp, (ub4)i,
(dvoid *)m_buffers[i-1], sizeof(OCINumber), SQLT_VNU,
(dvoid *)&m_ind[i-1], (ub2 *)0, (ub2 *)0,
(ub4)OCI_DEFAULT)))
throw COciException();
}
break;
case 4: //FLOAT DOUBLE
{
SetColInfo(i);
m_buffers[i-1] = new double;
int colsize = sizeof(double);
coltype = 4;
if (!COciException::checkErr(m_conn->m_errhp,
OCIDefineByPos(m_stmthp, &(m_defines[i-1]), m_conn->m_errhp, (ub4)i,
(dvoid *)(double*)m_buffers[i-1], (sb4)colsize, coltype,
(dvoid *)&m_ind[i-1], (ub2 *)0, (ub2 *)0,
(ub4)OCI_DEFAULT)))
throw COciException();
}
break;
case 96: //CHAR
case 9: //VARCHAR:
case 1: //VARCHAR2:
{
SetColInfo(i);
int colsize=m_col_size[i-1];
m_buffers[i-1] = (char *) new char[colsize+1];
memset(m_buffers[i-1],0,(colsize+1)); //preenche vetor com zeros
if (!COciException::checkErr(m_conn->m_errhp,
OCIDefineByPos(m_stmthp, &(m_defines[i-1]), m_conn->m_errhp, (ub4)i,
(dvoid *)m_buffers[i-1], (sb4)(colsize+1), SQLT_STR,
(dvoid *)&m_ind[i-1], (ub2 *)0, (ub2 *)0,
(ub4)OCI_DEFAULT)))
throw COciException();
}
break;
case 113 : //SQLT_BLOB
{
SetColInfo(i);
//分配LOB定位符句柄
if (!COciException::checkErr(m_conn->m_errhp,
OCIDescriptorAlloc((dvoid *) m_conn->m_envhp, (dvoid **) &(m_vp_lob[i-1]),
(ub4) OCI_DTYPE_LOB,
(size_t) 0, (dvoid **) 0)))
throw COciException();
if (!COciException::checkErr(m_conn->m_errhp,
OCIDefineByPos (m_stmthp, &(m_defines[i-1]), m_conn->m_errhp, (ub4)i,
(dvoid *)&(m_vp_lob[i-1]), 0 , SQLT_BLOB,
(dvoid *)&m_ind[i-1], (ub2 *)0, (ub2 *)0, OCI_DEFAULT)))
throw COciException();
}
break;
default:
break;
} //switch
} //for
return true;
}
//绑定输出变量 按索引绑定
void COciCursor::DefineByPos(int pos, void *value, int size, void *indicator, int type)
{
OCIDefine *defnp = NULL;
if (!COciException::checkErr(m_conn->m_errhp,
OCIDefineByPos(m_stmthp, &defnp, m_conn->m_errhp, (ub4)pos,
(dvoid *)value, (sb4)size, type,
(dvoid *)indicator, (ub2 *)0, (ub2 *)0,
(ub4)OCI_DEFAULT)))
throw COciException();
}
void COciCursor::Close()
{
if(m_isOpen)
{
OCIHandleFree((dvoid *)m_stmthp, (ub4)OCI_HTYPE_STMT);
FreeResult();
m_isOpen = false;
}
}
void COciCursor::FreeResult()
{
if (m_lobp)
{
OCIDescriptorFree((dvoid *) m_lobp, (ub4) OCI_DTYPE_LOB);
m_lobp = NULL;
}
}
ub4 COciCursor::GetLobSize(int col_id)
{
ub4 lenp=0;
if (!COciException::checkErr(m_conn->m_errhp,
OCILobGetLength(m_conn->m_svchp, m_conn->m_errhp, m_vp_lob[col_id], &lenp)))
throw COciException();
return lenp;
}
bool COciCursor::ReadBlob(std::string col_name,char *&buffer, int &bufsize)
{
int offset = 1;
int col_id=GetColIdWithColName(col_name);
if (col_id==-1)
{
throw COciException();
}
ub4 col_size=GetLobSize(col_id);
buffer=new char[col_size+1];
memset(buffer,0,col_size+1);
if (!COciException::checkErr(m_conn->m_errhp,
OCILobRead(m_conn->m_svchp, m_conn->m_errhp, m_vp_lob[col_id], &col_size, offset,
(dvoid *) buffer, (ub4)col_size , (dvoid *) 0, 0, (ub2) 0,
(ub1) SQLCS_IMPLICIT)))
throw COciException();
bufsize=col_size;
return true;
}
bool COciCursor::WriteBlob(std::string col_name, char *buffer, unsigned int bufsize)
{
int offset = 1;
int col_id=GetColIdWithColName(col_name);
if (col_id==-1)
{
throw COciException();
}
int status=OCILobOpen(m_conn->m_svchp, m_conn->m_errhp, m_vp_lob[col_id], OCI_LOB_READWRITE);
if (!COciException::checkErr(m_conn->m_errhp,
OCILobWrite(m_conn->m_svchp, m_conn->m_errhp, m_vp_lob[col_id], &bufsize, offset,
(dvoid *) buffer, (ub4) bufsize, OCI_ONE_PIECE,
(dvoid *)0, (sb4 (*)(dvoid *, dvoid *, ub4 *, ub1 *)) 0,
(ub2) 0, (ub1) SQLCS_IMPLICIT)))
{
throw COciException();
}
return true;
}
char* COciCursor::GetFildValue(int i)
{
int tempInt;
double tempDouble;
char str[30];
if(i < 1)
{
return (char*)0;
}
int numcols = NumCols();
int coltype = m_col_type[i-1]; //ColType(i);
int colsize = m_col_size[i-1]; //ColSize(i);
int colscale = m_col_scale[i-1]; //ColScale(i);
int indica = m_ind[i-1];
switch (coltype)
{
case 3: //INTEGER
if(indica == -1)
return "0";
tempDouble = *((double*)m_buffers[i-1]);
tempInt = (const int)tempDouble;
sprintf(str,"%d",tempInt);
m_fieldValue = str;
m_fieldValue = strClean((char*)m_fieldValue.c_str());
return ((char*)m_fieldValue.c_str());
break;
case 2: //NUMBER
if(indica == -1)
return "0";
if (!COciException::checkErr(m_conn->m_errhp,
OCINumberToReal(m_conn->m_errhp, ((OCINumber *)m_buffers[i-1]),
(uword)sizeof(double), (dvoid *)&tempDouble)))
throw COciException();
if(colscale > 0)
sprintf(str,"%lf",tempDouble);
else
sprintf(str,"%d",(int)tempDouble);
m_fieldValue = str;
m_fieldValue = strClean((char*)m_fieldValue.c_str());
return ((char*)m_fieldValue.c_str());
break;
case 4: //FLOAT DOUBLE
if(indica == -1)
return "0";
tempDouble = *((const double*)m_buffers[i-1]);
sprintf(str,"%lf",tempDouble);
m_fieldValue = str;
m_fieldValue = strClean((char*)m_fieldValue.c_str());
return ((char*)m_fieldValue.c_str());
break;
case 96: //CHAR
case 9: //VARCHAR:
case 1: //VARCHAR2:
if(indica == -1)
return "";
tempInt = strlen((char*)m_buffers[i-1]);
m_fieldValue = ((char*)m_buffers[i-1]);
m_fieldValue = strClean((char*)m_fieldValue.c_str());
return ((char*)m_fieldValue.c_str());
break;
case 108: //OBJECT SDO_GEOMETRY
default:
break;
} //switch
return (char*)0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -