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

📄 recset.cpp

📁 读取oracle的blob数据. 数据库连接以ODBC连接.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			case	SQL_REAL:
			case	SQL_FLOAT:
				SetFX_Real( m_Name[i], *(float *)m_Value[i]);
				break;

			case	SQL_DOUBLE:
				SetFX_Double( m_Name[i], *(double *)m_Value[i]);
				break;

			case	SQL_DATE:
			case	SQL_TIME:
			case	SQL_TIMESTAMP:
				SetFX_Date( m_Name[i], *(TIMESTAMP_STRUCT *)m_Value[i]);
				break;

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

			case	SQL_GUID:
			case    SQL_SQL_NVARCHAR:
			case	SQL_VARCHAR:
				SetFX_Text( m_Name[i],  (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:
				SetFX_Binary( m_Name[i], *(CMyByteArray *)m_Value[i]);
				break;

			default:
				break;
		}
	}
	//}}AFX_FIELD_MAP
}

//str的长度:MAXBUFFER+1
int CRecSet::getData(int icolumn, int irow, char *str)
{
	SQLSMALLINT		DataType;
	char *tok;
	int cbData;

	str[0]=0;

 
	if (IsEof()) return 0;

	DataType = m_Type[icolumn];

	switch (DataType)
	{
	case	SQL_BIT:
		cbData = sprintf(str,"%d", ((*(BOOL*)m_Value[icolumn])&0x00ff));
		break;
	case	SQL_TINYINT:
		cbData = sprintf(str,"%d", ((*(BYTE*)m_Value[icolumn])&0x00ff));
		break;
	case	SQL_SMALLINT:
		cbData = sprintf(str,"%d", ((*(int*)m_Value[icolumn])&0xffff));

		break;
	case	SQL_INTEGER:
		cbData = sprintf(str,"%d", *(long*)m_Value[icolumn]);
		break;
	case	SQL_REAL:
	case	SQL_FLOAT:
		pFloat = (float*)m_Value[icolumn];
		cbData = sprintf(str,"%f", *pFloat); trim0(str);
		break;
	case	SQL_DOUBLE:
		pDouble = (double*)m_Value[icolumn];
		sprintf(str,"%f", *pDouble);
		cbData = trim0(str);
		break;

	case	SQL_DATE:	
		date = (DATE_STRUCT *)m_Value[icolumn];
		cbData = sprintf(str,"%d/%d/%d", date->year, date->month, date->day);
		break;
	case	SQL_TIME:
		time = (TIME_STRUCT *)m_Value[icolumn];
		cbData = sprintf(str,"%d:%d:%d", time->hour, time->minute, time->second);
		break;
	case	SQL_TIMESTAMP:
		ts = (TIMESTAMP_STRUCT *)m_Value[icolumn];
		cbData = sprintf(str,"%d/%d/%d-%d:%d:%d", ts->year, ts->month, ts->day, ts->hour, ts->minute, ts->second);
		break;

	case    SQL_SQL_NCHAR:
	case	SQL_CHAR:
		tok = (char *)m_Value[icolumn];
		strcpy(str, tok);
		cbData = strlen(str);
		break;
	case	SQL_DECIMAL:
	case	SQL_NUMERIC:
		tok = (char *)m_Value[icolumn];
		strcpy(str, tok); trim0(str);
		cbData = strlen(str);
		break;

	case	SQL_GUID:
	case    SQL_SQL_NVARCHAR:
	case	SQL_VARCHAR:
		tok = (char *)m_Value[icolumn];
		strcpy(str, tok);
		cbData = strlen(str);

		break;

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

		
		cbData = pByteArray->GetDataSize();

		if (cbData)
		{
			tok = (char*)pByteArray->GetData();
#if 0
			//使用文件的语句
			int i,l;
		 
			h = OpenFile (tok, &of, OF_READ);
			l = _llseek(h,0, FILE_END); _llseek(h, 0, FILE_BEGIN);
			
			if (l<=MAXBUFFER)
			{
				l = _lread(h, str, l); str[l]=0;
			}
			else
			{
				strcpy(str, tok);
			}
			_lclose(h);
#else
			memcpy(str, tok, min(MAXBUFFER,cbData) );  str[min(MAXBUFFER, cbData)]=0;
#endif

			break;
		}
		else
		{
			sprintf(str,"");
			cbData = strlen(str);
		}
		break;

	default:
		cbData = 0;

		AfxMessageBox("Unknow column type!");
		break;
	}

	return cbData;
}

BOOL CRecSet::putData(int icolumn, char *str)
{
	int  l;
	int  y,m,d, h,f,s,w;

	char *tok;
	SQLSMALLINT		DataType;

	nullField[icolumn]= FALSE;

	if (str[0]==0)
	{
		if (!nullable[icolumn])
		{
			return FALSE;
		}
		nullField[icolumn]= TRUE;
		return TRUE;

	}

	DataType = m_Type[icolumn];
	
	switch (DataType)
	{
	case	SQL_BIT:
		pBool = (BOOL*)m_Value[icolumn];
		*pBool = (atol(str) &0x00ff);
		break;
	case	SQL_TINYINT:
		pByte = (BYTE*)m_Value[icolumn];
		*pByte = (BYTE)atol(str);
		break;
	case	SQL_SMALLINT:
		pInt = (int*)m_Value[icolumn];
		*pInt= (atol(str) &0xffff);

		break;
	case	SQL_INTEGER:
		pLong = (long*)m_Value[icolumn];
		*pLong= atol(str);			
		break;
	case	SQL_REAL:
	case	SQL_FLOAT:
		pFloat = (float*)m_Value[icolumn];
		*pFloat= (float)atof(str);
		break;
	case	SQL_DOUBLE:
		pDouble = (double*)m_Value[icolumn];
		*pDouble= atof(str);
		break;

	case	SQL_DATE:
		date = (DATE_STRUCT *)m_Value[icolumn];

		ctod(str, y,m,d, h,f,s, w);
		date->year = y;
		date->month= m;
		date->day  = d;
		break;

	case	SQL_TIME:
		time = (TIME_STRUCT *)m_Value[icolumn];

		ctod(str, y,m,d, h,f,s, w);
		time->hour   = h;
		time->minute = f;
		time->second = s;
		break;

	case	SQL_TIMESTAMP:
		ts = (TIMESTAMP_STRUCT *)m_Value[icolumn];

		if (str[0] != '\'')
		{
			char scc[256];
			strcpy(scc, str);
			strcpy(str,"\'");
			strcat(str, scc);
			strcat(str,"\'");
		}

		ctod(str, y,m,d, h,f,s, w);
		ts->year = y;
		ts->month= m;
		ts->day  = d;
		ts->hour = h;
		ts->minute=f;
		ts->second=s;
		ts->fraction=0;


	
		break;

	case    SQL_SQL_NCHAR:
	case	SQL_CHAR:
	case	SQL_DECIMAL:
	case	SQL_NUMERIC:
		int nnnn;
		
		nnnn=min(strlen(str), m_Width[icolumn]);
		str[nnnn]=0;
		tok = (char*)m_Value[icolumn];
		strcpy(tok, str);		
		break;


	case	SQL_GUID:
	case    SQL_SQL_NVARCHAR:
	case	SQL_VARCHAR:
		
		nnnn=min(strlen(str), m_Width[icolumn]);
		str[nnnn]=0;

	
		tok = (char*)m_Value[icolumn];
		strcpy(tok, str);		
		break;

	case    SQL_SQL_NTEXT:
	case	SQL_BINARY:
	case	SQL_VARBINARY:
	case	SQL_LONGVARCHAR:
	case	SQL_LONGVARBINARY:
	case	SQL_ORA_LOB:
		pByteArray = (CMyByteArray*)m_Value[icolumn];
	
		l = strlen(str)+1;
		pByteArray->SetDataSize(l);
		tok = (char*)pByteArray->GetData();
		strcpy(tok, str);
		break;

	default:
		AfxMessageBox("Unknow column type!");
		break;
	}
	return TRUE;
}


 
BOOL CRecSet::Open(char *sql)
{
	int ii = CSQLSetX::Open(sql);

	//当初始化不成功时,用基类的信息:
	if (m_nFields==0)
	{
		m_nFields = CSQLSetX::m_nColumn;
 
		CString m_strColumnName;
 		SQLPOINTER		TargetValuePtr;
		UINT			m_lPrecision;
		int m_nDataType;
		int ColumnNumber = 0;

		for (int i=0; i< m_nFields; i++)
		{
			m_strColumnName = CSQLSetX::m_strName[i];

  			for (int k=0; k<ColumnNumber; k++)
			{
				if (m_strName[k]==m_strColumnName) break;
			}
			if (k<ColumnNumber)
			{
 				continue;
			}

			

			//允许null否:
			nullable[ColumnNumber] = CSQLSetX::Nullable[i];
			 

			//字段的其它信息:
 			m_nDataType		=CSQLSetX::m_Type[i];
			m_lPrecision	=CSQLSetX::m_Width[i];

			m_Name.Add (CSQLSetX::m_Name[i]);

			m_Width.Add(m_lPrecision );
			m_Type.Add ( m_nDataType);
			m_strName.Add( m_strColumnName );//label

			m_strType.Add( CSQLSetX::m_strType[i]);	//原始类型
			m_strTable.Add(CSQLSetX::m_strTable[i]);
			
			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;

	#ifdef  SQL_NUMERIC_BIND_DOUBLE
				case	SQL_DECIMAL:
				case	SQL_NUMERIC:
	#endif
				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:
	#ifndef SQL_NUMERIC_BIND_DOUBLE
				case	SQL_DECIMAL:
				case	SQL_NUMERIC:
	#endif
					TargetValuePtr	= new char[(WORD)m_lPrecision+1];
					m_Value.Add(TargetValuePtr);
					break;
				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;
			}

			ColumnNumber++;

		}

		//告诉基类,当前的变量地址
		CSQLSetX::m_col = 0;
		m_nFields = ColumnNumber;	//实际绑定的字段数目


		DoFieldExchange(NULL);
  
	}
	return ii;

}

⌨️ 快捷键说明

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