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

📄 tociquery.cpp

📁 调用OCI的C++类
💻 CPP
📖 第 1 页 / 共 4 页
字号:
{	ub1 innerBuf[MAX_LOB_BUFFER_LENGTH];	ub4 remainder, nActual, nTry;	ub4  flushedAmount = 0, offset = 1;	if (fParentQuery->fBof || fParentQuery->fEof)		throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "asBlobBuffer()", name);	if (type != SQLT_BLOB)		throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "asLobBuffer()");	OCILobGetLength(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, &remainder);	*lobLength = nActual = nTry = remainder;	try	{		if (iBlobBufCnt<remainder){			if (buf)				delete []buf;			buf = new unsigned char[sizeof(ub1) * remainder];			iBlobBufCnt=remainder;		}	}	catch (...)	{		throw TOCIException(fParentQuery->fSqlStmt, ERR_NOMORE_MEMORY_BE_ALLOCATED, "asBlobBuffer()", __LINE__);	}	nTry = nActual = MAX_LOB_BUFFER_LENGTH;	while (remainder)	{				fParentQuery->fErrorNo = OCILobRead(fParentQuery->db->hDBSvc, fParentQuery->hErr, 			hBlob, &nActual, (ub4)offset, (dvoid *)innerBuf, (ub4) nTry, (dvoid *)0, 			(sb4 (*)(dvoid *, CONST dvoid *, ub4, ub1)) 0, (ub2) 0, (ub1) SQLCS_IMPLICIT);		fParentQuery->checkError();	  		memcpy( (buf) + offset -1, innerBuf, nActual);		if (nActual<=0) break;				offset += nActual;		remainder -= nActual;	}}void  TOCIField::loadFromFile(const char *fileName){	ub4 remainder, nActual, nTry, offset = 1;//从文件中读取的剩余数据量	ub1 buf[MAX_LOB_BUFFER_LENGTH];	ub4 LobLength;	ub4  flushedAmount = 0;	FILE *fileHandle ;	if (fParentQuery->fBof || fParentQuery->fEof)		throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "LoadFromFile()", name);	if (type != SQLT_BLOB)		throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "LoadFromFile()");	if( (fileHandle = fopen(fileName, (const char *) "rb")) == NULL )		throw TOCIException(fParentQuery->fSqlStmt, ERR_FILE_IO, "LoadFromFile()", fileName);		fseek(fileHandle,0,SEEK_END);	remainder = ftell(fileHandle);	fseek(fileHandle, 0, 0);	fParentQuery->fErrorNo = OCILobGetLength(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, &LobLength);	fParentQuery->checkError();	fParentQuery->fErrorNo = OCILobTrim(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, 0);	fParentQuery->checkError();	/* enable the BLOB locator for buffering operations */	fParentQuery->fErrorNo = OCILobEnableBuffering(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob);	fParentQuery->checkError();	while ( (remainder > 0) && !feof(fileHandle))	{		nActual = nTry = (remainder > MAX_LOB_BUFFER_LENGTH) ? MAX_LOB_BUFFER_LENGTH : remainder;				if (fread((void *)buf, (size_t)nTry, (size_t)1, fileHandle) != (size_t)1)			throw TOCIException(fParentQuery->fSqlStmt, ERR_MEM_BUFFER_IO, name, fileName, __LINE__);				fParentQuery->fErrorNo = OCILobWrite(fParentQuery->db->hDBSvc, fParentQuery->hErr, 			hBlob, &nActual, offset, (dvoid *) buf, (ub4) nTry, OCI_ONE_PIECE, (dvoid *)0,			(sb4 (*)(dvoid *, dvoid *, ub4 *, ub1 *)) 0,	(ub2) 0, (ub1) SQLCS_IMPLICIT);		if ( fParentQuery->fErrorNo != OCI_SUCCESS) 		{			fclose(fileHandle);			fParentQuery->checkError();		}		flushedAmount += nTry;		remainder -= nTry;		offset += nTry;		//incase the internal buffer is not big enough for the lob , flush the buffer content to db after some interval:		if (flushedAmount >= LOB_FLUSH_BUFFER_SIZE)		{			flushedAmount = 0;			fParentQuery->fErrorNo = OCILobFlushBuffer(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, OCI_LOB_BUFFER_NOFREE);			fParentQuery->checkError();			}	}	if ( flushedAmount )	{			fParentQuery->fErrorNo = OCILobFlushBuffer(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, OCI_LOB_BUFFER_NOFREE);			fParentQuery->checkError();		}	fclose(fileHandle);}void  TOCIField::loadFromBuffer(unsigned char *buf, unsigned int bufLength){	ub1 innerBuf[MAX_LOB_BUFFER_LENGTH];	ub4 remainder, nActual, nTry;	ub4  flushedAmount = 0, offset = 1;	if (fParentQuery->fBof || fParentQuery->fEof)		throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "LoadFromBuffer()", name);	if (type != SQLT_BLOB)		throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "LoadFromBuffer()");		fParentQuery->fErrorNo = OCILobTrim(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, 0);	fParentQuery->checkError();	remainder = bufLength;	/* enable the BLOB locator for buffering operations */	fParentQuery->fErrorNo = OCILobEnableBuffering(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob);	fParentQuery->checkError();	while (remainder > 0)	{		nActual = nTry = (remainder > MAX_LOB_BUFFER_LENGTH) ? MAX_LOB_BUFFER_LENGTH : remainder;				memcpy(innerBuf, buf + offset-1, nActual);		fParentQuery->fErrorNo = OCILobWrite(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob,			&nActual, offset, (dvoid *)innerBuf, (ub4)nTry, OCI_ONE_PIECE, (dvoid *)0,			(sb4 (*)(dvoid *, dvoid *, ub4 *, ub1 *)) 0,	(ub2) 0, (ub1) SQLCS_IMPLICIT);		fParentQuery->checkError();				flushedAmount += nTry;		remainder -= nTry;		offset += nTry;		if (flushedAmount >= LOB_FLUSH_BUFFER_SIZE)		{			flushedAmount = 0;			fParentQuery->fErrorNo = OCILobFlushBuffer(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, OCI_LOB_BUFFER_NOFREE);			fParentQuery->checkError();			}	}	if ( flushedAmount )	{			fParentQuery->fErrorNo = OCILobFlushBuffer(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, OCI_LOB_BUFFER_NOFREE);			fParentQuery->checkError();		}}double TOCIField::asFloat(){	double iRet; 	int status;	if (fParentQuery->fBof || fParentQuery->fEof)		throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "asFloat()", name);	if ( isNULL() )		return 0;	if ( (type == FLOAT_TYPE) || ( type == INT_TYPE) ){		if ( (status=OCINumberToReal(fParentQuery->hErr, (OCINumber *)(fDataBuf + (size+1) * fParentQuery->fCurrRow ),sizeof(iRet), &iRet))!= OCI_SUCCESS)		{			fParentQuery->checkError();		}		return iRet;	}		else	throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "asFloat()");}char* TOCIField::asDateTimeString(){	int year, month, day, hour, minute, second;	if (fParentQuery->fBof || fParentQuery->fEof)		throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "asDateTimeString()", name);	if (type != DATE_TYPE)		throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "asDateTimeString()");	else	{		this->asDateTimeInternal(year, month, day, hour, minute, second);		if ( year == 0 )				sprintf( (char *)fStrBuffer, NULL_STRING);		else	sprintf( (char *)fStrBuffer,"%d-%d-%d %d:%d:%d", year, month, day, hour, minute,second);		return (char *)fStrBuffer;	}}void	TOCIField::asDateTime(int &year, int &month, int &day, int &hour, int &minute, int &second){	if (fParentQuery->fBof || fParentQuery->fEof)		throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "asDateTime()", name);	if (type != DATE_TYPE)		throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "asDateTime()");	else this->asDateTimeInternal(year, month, day, hour, minute, second);}void	TOCIField::asDateTimeInternal(int &year, int &month, int &day, int &hour, int &minute, int &second){	unsigned char cc,yy,mm,dd,hh,mi,ss;	ub1	*data;	if ( isNULL() )	{		year = 0;		month = 0;		day = 0;		hour = 0;		minute = 0;		second = 0;		return;	}	data = fDataBuf + 7 * (fParentQuery->fCurrRow);	cc=data[0];		yy=data[1]; 	mm=data[2]; 	dd=data[3]; 	hh=data[4]-1; 	mi=data[5]-1; 	ss=data[6]-1; 	cc=(unsigned char)abs(cc-100);	yy=(unsigned char)abs(yy-100);	year = (unsigned int)cc*100 + (unsigned int) yy;	month = mm;	day = dd;	hour = hh;	minute = mi;	second = ss;}int TOCIField::asInteger(){		int iRet=0,status;	if (fParentQuery->fBof || fParentQuery->fEof)		throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "asInteger()", name);	if (type != INT_TYPE && type != FLOAT_TYPE)		throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "asInteger()");	else {		if ( (status=OCINumberToInt(fParentQuery->hErr, (OCINumber *)(fDataBuf + (size+1) * fParentQuery->fCurrRow ),sizeof(iRet), OCI_NUMBER_SIGNED,&iRet))!= OCI_SUCCESS)		{			fParentQuery->checkError();		}		return iRet;	}}long TOCIField::asLong(){		long iRet=0,status;	if (fParentQuery->fBof || fParentQuery->fEof)		throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "asLong()", name);	if (type != INT_TYPE && type != FLOAT_TYPE)		throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "asLong()");	else {		if ( (status=OCINumberToInt(fParentQuery->hErr, (OCINumber *)(fDataBuf + (size+1) * fParentQuery->fCurrRow ),sizeof(iRet), OCI_NUMBER_SIGNED, &iRet))!= OCI_SUCCESS)		{			fParentQuery->checkError();		}		return iRet;	}}/*********** TOCIQuery Implementation************/TOCIQuery::TOCIQuery(TOCIDatabase *oradb){	if (! oradb->fConnected)		throw TOCIException("", ERR_GENERAL, "TOCIQuery(TOCIDatabase &db): Can not declare a TOCIQuery when the database is not connected");	fFetched = 0;	fPrefetchRows = 1;	fCurrRow = 0;	fTotalRowsFetched = 0;	fBof = false;	fEof = false;//Added begin at ver : 0.0.0.6#ifdef __DEBUG__    bExecuteFlag = false;#endif//Added end at ver : 0.0.0.6	nTransTimes = 0;	db = oradb;	fActivated = false;	fFieldCount = 0;	fParamCount = 0;	fSqlStmt = NULL;	paramList = NULL;	fieldList = NULL;	fErrorNo = OCIHandleAlloc(db->hEnv, (dvoid **) &hErr,(ub4) OCI_HTYPE_ERROR,(size_t) 0, (dvoid **) 0);	checkError();	fErrorNo = OCIHandleAlloc(db->hEnv, (dvoid **)&hStmt, OCI_HTYPE_STMT, 0, 0);	checkError();		//fErrorNo = OCIHandleAlloc(db->hEnv, (dvoid **)&hTrans, OCI_HTYPE_TRANS, 0, 0);	//checkError();}TOCIQuery::TOCIQuery(TOCIDatabase *oradb,TOCISession *session){	if (! session->m_bActive)		throw TOCIException("", ERR_GENERAL, "TOCIQuery(TOCIDatabase &db): Can not declare a TOCIQuery when the database is not connected");	fFetched = 0;	fPrefetchRows = 1;	fCurrRow = 0;	fTotalRowsFetched = 0;	fBof = false;	fEof = false;//Added begin at ver : 0.0.0.6#ifdef __DEBUG__    bExecuteFlag = false;#endif//Added end at ver : 0.0.0.6	nTransTimes = 0;	db = oradb;	fActivated = false;	fFieldCount = 0;	fParamCount = 0;	fSqlStmt = NULL;	paramList = NULL;	fieldList = NULL;/*	hUser = session->m_hSession;*/	hErr = session->m_hError;	/*hSvc = session->m_hSrvCtx;	*/	fErrorNo = OCIHandleAlloc(db->hEnv, (dvoid **)&hStmt, OCI_HTYPE_STMT, 0, 0);	checkError();		//fErrorNo = OCIHandleAlloc(db->hEnv, (dvoid **)&hTrans, OCI_HTYPE_TRANS, 0, 0);	//checkError();	}TOCIQuery::~TOCIQuery(){	if (fSqlStmt != NULL)		delete[] fSqlStmt;	if (fParamCount >0)		delete[] paramList;	if (fFieldCount >0)		delete[] fieldList;	if (nTransTimes)	{		//fErrorNo = OCITransRollback(db->hDBSvc, hErr, OCI_DEFAULT);		//checkError();	}//Added begin at ver : 0.0.0.6#ifdef __DEBUG__    if(bExecuteFlag)        userlog("TOCIQuery执行了Execute()但是没有提交或回滚,可能造成锁表。"); #endif//Added end at ver : 0.0.0.6/*	OCISessionEnd (hSvc, hErr, hUser, OCI_DEFAULT);*/	OCIHandleFree(hStmt, OCI_HTYPE_STMT);	//OCIHandleFree(hTrans,OCI_HTYPE_TRANS);	/*OCIHandleFree(hSvc, OCI_HTYPE_SVCCTX);	OCIHandleFree(hUser,OCI_HTYPE_SESSION);	*/	OCIHandleFree(hErr,OCI_HTYPE_ERROR);}void TOCIQuery::close(){	if (! fActivated)		return;		if (fSqlStmt != NULL)	{		delete[] fSqlStmt;		fSqlStmt = NULL;	}	if (fParamCount > 0)	{		delete[] paramList;		paramList = NULL;	}	if (fFieldCount > 0)	{		delete[] fieldList;		fieldList = NULL;	}		fFieldCount = 0;	fParamCount = 0;	fActivated = false;	fFetched = 0;	fPrefetchRows = PREFETCH_ROWS;	fCurrRow = 0;	fTotalRowsFetched = 0;}bool TOCIQuery::commit(){	bool exeSuccess = false;//Added begin at ver : 0.0.0.6#ifdef __DEBUG__    bExecuteFlag = false;#endif//Added end at ver : 0.0.0.6	fErrorNo = OCITransCommit(db->hDBSvc, hErr, OCI_DEFAULT);	checkError();	if (fErrorNo == OCI_SUCCESS)		nTransTimes = 0;	return (fErrorNo == OCI_SUCCESS);	}bool TOCIQuery::rollback(){	bool exeSuccess = false;//Added begin at ver : 0.0.0.6#ifdef __DEBUG__    bExecuteFlag = false;#endif//Added end at ver : 0.0.0.6	fErrorNo = OCITransRollback(db->hDBSvc, hErr, OCI_DEFAULT);	if (fErrorNo == OCI_SUCCESS)	{		nTransTimes = 0;		exeSuccess = true;	}	else		checkError();	return exeSuccess;}void TOCIQuery::getFieldsDef(){	char temp[20];		TOCIField *pCurrField;	OCIParam	*param = (OCIParam *)0;	ub4			counter;			//计数器,在循环语句中实用	ub4			nColumnCount;	//在分析sqlstmt后,获得的列数目	//以下参数的长度参见"OCI Programmer's" Guide P208 , 6-10	text   *columnName;				//字段名称	ub4	 columnNameLength,j;		//字段名称长度 unsigned int	ub2	 innerDataSize;			//数据长度 unsigned short	ub2	 innerDataType;			//Oracle 内部数据类型 signed short	ub2	 innerPrecision;			//包括小数点的总位数, ub1 is a bug in documentation?	sb1    innerScale;				//小数点个数	ub1    innerIsNULL;				//是否允许为空值	

⌨️ 快捷键说明

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