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

📄 recset.cpp

📁 读取oracle的blob数据. 数据库连接以ODBC连接.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MetaSet.cpp: implementation of the CRecSet class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "RecSet.h"

void ctod(char *bit, int &y,int &m,int &d, int &h,int &f,int &s, int &w);
int trim0(char *);
int trim(char *);


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CRecSet::CRecSet(CDatabaseX* pdb, char *tableName, char *aliaName )
	: CSQLSetX(pdb)
{
	m_pDatabase = pdb;
	m_trueTableName = tableName;
	m_aliaTableName = aliaName;
	nkf=0;

	memset(rowIdVar,0, 256);
	memset(autoVar,0, 256);
	memset(chkVar,0, 256);
	memset(m_sel, _IS_NO_USE_, sizeof(BOOL)*256);

	for (int j=0; j<50; j++)
	{
		for (int i=0; i<256; i++) metas[j][i]=NULL;
	}
	deleteVars();

	m_nFields = 0;
	where = "";
	fldsNotes="";

	//打开输入表:
	CString cstr;

	SQLRETURN		nRetcode;
	SQLHSTMT		hstmt;
	SQLSMALLINT		ColumnNumber;
	
	SQLCHAR			ColumnName[32];
	SQLSMALLINT		BufferLength;
	
	SQLSMALLINT		NameLength;
	SQLSMALLINT		DataType;
	SQLUINTEGER		ColumnSize ;
	SQLSMALLINT		DecimalDigits;
	SQLSMALLINT		Nullable;
	SQLINTEGER		strLen_or_Ind;
	SQLPOINTER		TargetValuePtr;



	//分配一个临时语句,以取得当前表的字段信息:
	nRetcode = SQLAllocStmt(m_pDatabase->m_hdbc, &hstmt);
	
	if (!Check(nRetcode))
	{
		return ;
	}

	//调用 ODBC 函数以得到字段的集合(每字段一行)
	nRetcode= SQLColumns(hstmt,
			NULL, SQL_NTS,
			NULL, SQL_NTS,
			(UCHAR FAR *)(const char*)m_trueTableName, SQL_NTS,
			NULL, SQL_NTS ) ;
	
	if (!Check(nRetcode))
	{
		nRetcode=SQLCloseCursor(hstmt);
		nRetcode=SQLFreeStmt(hstmt, SQL_CLOSE);
		nRetcode=SQLFreeStmt(hstmt, SQL_DROP);
		return 	;
	}

	//表述每一字段的属性数目(也即结果集合的列数,目前有12项):

	short mColumn;

	nRetcode = SQLNumResultCols(hstmt, &mColumn);



	char    m_strColumnName[256];
	char    m_strTypeName[256];
	UINT    m_nDataType;
	UINT    m_lPrecision;
	UINT	m_nScale;
	UINT	m_nRadix;
	UINT	m_nNullable;


	//构造用于读取各字段的参数:
	for (ColumnNumber=1; ColumnNumber<=mColumn; ColumnNumber++)
	{	
		BufferLength = 32;

		//字段的名称,SQL类型,宽度,小数位数,允许NULL否等:
		nRetcode = SQLDescribeCol(hstmt, ColumnNumber,
				ColumnName,
				BufferLength,
				&NameLength,

				&DataType,
				&ColumnSize ,
				&DecimalDigits,
				&Nullable);

		_strupr((char*)ColumnName);

		//列的名字
		if (_tcsnicmp((char*)ColumnName, "column_name", strlen("column_name"))==0)
			nRetcode = SQLBindCol(hstmt,ColumnNumber,	SQL_C_CHAR,
			m_strColumnName,
			128,&strLen_or_Ind);
		
		//原始类型	
		else if (_tcsnicmp((char*)ColumnName, "type_name", strlen("type_name"))==0)
			nRetcode = SQLBindCol(hstmt,ColumnNumber,	SQL_C_CHAR,
			m_strTypeName,
			128,&strLen_or_Ind);

		//数据SQL类型
		else if (_tcsnicmp((char*)ColumnName, "data_type", strlen("data_type"))==0)
			nRetcode = SQLBindCol(hstmt,ColumnNumber,	SQL_C_SLONG,
			&m_nDataType,
			0, &strLen_or_Ind);


		//列宽度
		else if (_tcsnicmp((char*)ColumnName, "precision", strlen("precision"))==0 || _tcsnicmp((char*)ColumnName, "COLUMN_SIZE", strlen("COLUMN_SIZE"))==0)
			nRetcode = SQLBindCol(hstmt,ColumnNumber,	SQL_C_SLONG,
			&m_lPrecision,
			0, &strLen_or_Ind);

		else if (_tcsnicmp((char*)ColumnName, "scale", strlen("scale"))==0 || _tcsnicmp((char*)ColumnName, "DECIMAL_DIGITS", strlen("DECIMAL_DIGITS"))==0 )
			nRetcode = SQLBindCol(hstmt,ColumnNumber,	SQL_C_SLONG,
			&m_nScale,
			0, &strLen_or_Ind);
		else if (_tcsnicmp((char*)ColumnName, "radix", strlen("radix"))==0||_tcsnicmp((char*)ColumnName, "NUM_PREC_RADIX", strlen("NUM_PREC_RADIX"))==0)
			nRetcode = SQLBindCol(hstmt,ColumnNumber,	SQL_C_SLONG,
			&m_nRadix,
			0, &strLen_or_Ind);
		else if (_tcsnicmp((char*)ColumnName, "nullable", strlen("nullable"))==0)
			nRetcode = SQLBindCol(hstmt,ColumnNumber,	SQL_C_SLONG,
			&m_nNullable,
			0, &strLen_or_Ind);
	}



	//返回各字段一般信息:
	m_nFields = 0;
	ColumnNumber=0;
	
	nRetcode = SQLFetch(hstmt);
	
	int ii;
	
	while(nRetcode != SQL_NO_DATA_FOUND)
	{
		if (nRetcode != SQL_SUCCESS) break;

		//将列名转为大写:
		_strupr((char*)m_strColumnName); trim((char*)m_strColumnName);
#if 0		
		if (m_strColumnName=="ROWID") 
		{
			nRetcode = SQLFetch(hstmt);
			continue;

		}
		if (m_strColumnName=="REC_SYS_DATE") 
		{
			nRetcode = SQLFetch(hstmt);
			continue;

		}
#endif	
		for (ii=0; ii<ColumnNumber; ii++)
		{
			if (m_strName[ii]==m_strColumnName) break;
		}
		if (ii<ColumnNumber)
		{
			nRetcode = SQLFetch(hstmt);

			continue;
		}
if (CloseBindLong)
{

	if (m_nDataType== SQL_SQL_NTEXT ||
		m_nDataType== SQL_BINARY ||
		m_nDataType== SQL_VARBINARY ||
		m_nDataType== SQL_LONGVARCHAR ||
		m_nDataType== SQL_LONGVARBINARY ||
		m_nDataType== SQL_ORA_LOB) 
	{
		nRetcode = SQLFetch(hstmt);
		continue;
	}
}

		ColumnNumber++;

		//允许null否:
		nullable[ColumnNumber-1] = m_nNullable;
		if (strcmp(m_strColumnName,"ROWID")==0 ) 
		{
			nullable[ColumnNumber-1] = 1;
		}
		if (strcmp(m_strColumnName,"REC_SYS_DATE")==0) 
		{
			nullable[ColumnNumber-1] = 1;
		}


		//字段的其它信息:
		cstr = m_strColumnName;

		m_Name.Add ( "["+cstr+"]" );
		m_Width.Add(m_lPrecision );
		m_Type.Add ( m_nDataType);

		m_strName.Add( m_strColumnName );//label
		m_strType.Add( m_strTypeName );	//原始类型
		m_strTable.Add( m_trueTableName);

		switch (m_nDataType)
		{
			case	SQL_BIT:
				TargetValuePtr  = new BOOL;
				m_Value.Add(TargetValuePtr);
				break;

			case	SQL_TINYINT:
				TargetValuePtr  = new BYTE;
				m_Value.Add(TargetValuePtr);				
				break;

			case	SQL_SMALLINT:
				TargetValuePtr  = new int;
				m_Value.Add(TargetValuePtr);
				break;

			case	SQL_INTEGER:
				TargetValuePtr	= new long;
				m_Value.Add(TargetValuePtr);
				break;

			case	SQL_REAL:
			case	SQL_FLOAT:
				TargetValuePtr	= new float;
				m_Value.Add(TargetValuePtr);
				break;

			case	SQL_DOUBLE:
				TargetValuePtr	= new double;
				m_Value.Add(TargetValuePtr);
				break;

			case	SQL_DATE:
				TargetValuePtr	= new DATE_STRUCT;
				m_Value.Add(TargetValuePtr);
				break;

			case	SQL_TIME:
				TargetValuePtr	= new TIME_STRUCT;
				m_Value.Add(TargetValuePtr);
				break;

			case	SQL_TIMESTAMP:
				TargetValuePtr	= new TIMESTAMP_STRUCT;
				m_Value.Add(TargetValuePtr);
				break;

			case    SQL_SQL_NCHAR:
			case	SQL_CHAR:
				TargetValuePtr	= new char[(WORD)m_lPrecision+1];
				m_Value.Add(TargetValuePtr);
				break;
			case	SQL_DECIMAL:
			case	SQL_NUMERIC:
				TargetValuePtr	= new char[(WORD)m_lPrecision+1];
				m_Value.Add(TargetValuePtr);
				break;
			case	SQL_GUID:
			case    SQL_SQL_NVARCHAR:
			case	SQL_VARCHAR:
				TargetValuePtr	= new char[(WORD)m_lPrecision+1];
				m_Value.Add(TargetValuePtr);
				break;

			case    SQL_SQL_NTEXT:
			case	SQL_BINARY:
			case	SQL_VARBINARY:
			case	SQL_LONGVARCHAR:
			case	SQL_LONGVARBINARY:
			case	SQL_ORA_LOB:
				TargetValuePtr	= new CMyByteArray;
				m_Value.Add(TargetValuePtr);
				break;

			default:
				TargetValuePtr  = new BOOL;
				m_Value.Add(TargetValuePtr);
				break;
		}
		nRetcode = SQLFetch(hstmt);
	}

	m_nFields = ColumnNumber;

	nRetcode=SQLCloseCursor(hstmt);
	nRetcode=SQLFreeStmt(hstmt, SQL_CLOSE);
	nRetcode=SQLFreeStmt(hstmt, SQL_DROP);
		
}

void CRecSet::deleteVars()
{

	int  i, n;

	n = m_Value.GetSize();


	for (i=n-1; i>=0; i--)
	{	
		switch (m_Type[i])
		{
			case	SQL_BIT:
				delete (BOOL *)m_Value[i];
				break;

			case	SQL_TINYINT:
				delete (BYTE *)m_Value[i];
				break;

			case	SQL_SMALLINT:
				delete (int *)m_Value[i];
				break;

			case	SQL_INTEGER:
				delete (long *)m_Value[i];
				break;

			case	SQL_REAL:
			case	SQL_FLOAT:
				delete (float *)m_Value[i];
				break;

			case	SQL_DOUBLE:
				delete (double *)m_Value[i];
				break;

			case	SQL_DATE:
				delete (DATE_STRUCT *)m_Value[i];
				break;

			case	SQL_TIME:
				delete (TIME_STRUCT *)m_Value[i];
				break;

			case	SQL_TIMESTAMP:
				delete (TIMESTAMP_STRUCT *)m_Value[i];
				break;

			case    SQL_SQL_NCHAR:
			case	SQL_CHAR:
			case	SQL_DECIMAL:
			case	SQL_NUMERIC:
				delete (char *)m_Value[i];
				break;

			case	SQL_GUID:
			case    SQL_SQL_NVARCHAR:
			case	SQL_VARCHAR:
				delete (char *)m_Value[i];
				break;

			case    SQL_SQL_NTEXT:
			case	SQL_BINARY:
			case	SQL_VARBINARY:
			case	SQL_LONGVARCHAR:
			case	SQL_LONGVARBINARY:
			case	SQL_ORA_LOB:
				CMyByteArray*	pByteArray;
				pByteArray= (CMyByteArray*)m_Value[i];
				delete pByteArray;
				break;

			default:
				delete (BOOL *)m_Value[i];
				break;
		}

	}


	m_Value.RemoveAll();	//指针数组
	m_Name.RemoveAll();		//串数组

	m_strName.RemoveAll();	//串数组
	m_strTable.RemoveAll();	//串数组
	m_strType.RemoveAll();	//串数组
	
	m_Width.RemoveAll();	//字数组	
	m_Type.RemoveAll();		//整数数组

}
 

CRecSet::~CRecSet()
{
	deleteVars();
}

void CRecSet::OnSetOptions(HSTMT hstmt) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	CSQLSetX::OnSetOptions(hstmt);

}

void CRecSet::DoFieldExchange(CFieldExchange* pFX)
{
	//{{AFX_FIELD_MAP(CRecSet)
	for (int i=0; i<m_nFields; i++)
	{
		switch (m_Type[i])
		{
			case	SQL_BIT:
				SetFX_Bool(m_Name[i], *(BOOL *)m_Value[i]);
				break;

			case	SQL_TINYINT:
				SetFX_Byte(m_Name[i], *(BYTE *)m_Value[i]);
				break;

			case	SQL_SMALLINT:
				SetFX_Int( m_Name[i], *(int *)m_Value[i]);
				break;

			case	SQL_INTEGER:
				SetFX_Long( m_Name[i], *(long *)m_Value[i]);
				break;

⌨️ 快捷键说明

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