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

📄 ocicursor.cpp

📁 利用Boost库的正则表达式从中国气象网取天气预报,并将其写入Oracle数据库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -