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

📄 dhadofield.cpp

📁 ADO查看数据库工具的原码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// DHAdoField.cpp: implementation of the CDHAdoField class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DHAdoField.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

void	BinaryToString( CString& cStr, const CLongBinary& bin, bool bExpand )
{
	int	nSize = min( (int)bin.m_dwDataLength, cStr.GetLength() );
	if( bExpand )
		nSize = bin.m_dwDataLength;

	if( nSize < 1 ) {
		cStr.Empty();
		return;
	}

	void*	p = ::GlobalLock( bin.m_hData );
	if( p == NULL )
		::AfxThrowMemoryException();
	
	char* pStr = cStr.GetBuffer( nSize );
	memcpy( pStr, p, nSize );
	cStr.ReleaseBuffer( nSize );
	::GlobalUnlock( bin.m_hData );
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDHAdoField::CDHAdoField()
{
	m_FieldPtr = NULL;
}

CDHAdoField::~CDHAdoField()
{
	if(m_binary.m_hData != NULL)
	{
		::GlobalFree(m_binary.m_hData);
		m_binary.m_hData = NULL;
	}
}

CDHAdoField::CDHAdoField(const FieldPtr ptr)
{
	m_FieldPtr = ptr;
}

CLongBinary* CDHAdoField::AsBinary()
{
	try
	{
		if(!IsBinary())
		{
			return NULL;
		}
		long lDataSize = GetBinaryLen();
		if(lDataSize > 0)
		{
			_variant_t	varBLOB;
			varBLOB = m_FieldPtr->GetChunk(lDataSize);
			if(varBLOB.vt == (VT_ARRAY | VT_UI1))
			{
				if(m_binary.m_hData != NULL)
				{
					::GlobalFree(m_binary.m_hData);
					m_binary.m_hData = NULL;
				}
				if(m_binary.m_hData = ::GlobalAlloc(GMEM_FIXED , lDataSize+1))				///重新分配必要的存储空间
				{	
					m_binary.m_dwDataLength = lDataSize;
					memset(m_binary.m_hData, 0, lDataSize+1);
					char *pBuf = NULL;
					SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
					memcpy(m_binary.m_hData,pBuf,lDataSize);				///复制数据到缓冲区m_pBMPBuffer
					SafeArrayUnaccessData (varBLOB.parray);			
				}
			}
		}
		else
		{
			return NULL;
		}
		return &m_binary;
	}
	catch(_com_error& e)
	{
		TRACE1("%s\n", e.Description());
		return NULL;
	}
}

bool CDHAdoField::AsBool() const
{
	try
	{
		if(IsNull())
			return false;
		switch( GetDBVT() )
		{
		case	DBVT_BOOL:
				if(m_FieldPtr->GetValue().boolVal == 0)
					return false;
				else
					return	true;

		case	DBVT_UCHAR:
				return	(m_FieldPtr->GetValue().cVal == 'T' || m_FieldPtr->GetValue().cVal == '1');
		case	DBVT_SHORT:
					return	(m_FieldPtr->GetValue().intVal != 0);
		case	DBVT_LONG:
					return	(m_FieldPtr->GetValue().lVal != 0);
		case	DBVT_SINGLE:
					return	(m_FieldPtr->GetValue().fltVal != 0.0);
		case    DBVT_DOUBLE:
					return	(m_FieldPtr->GetValue().dblVal != 0.0);
		case	DBVT_DATE:
					ASSERT( FALSE );
					break;
		case DBVT_STRING:
					return	(((char*)(_bstr_t)m_FieldPtr->GetValue().bstrVal)[0] == 'T' || (m_FieldPtr->GetValue().bstrVal)[0] == '1');
		case DBVT_BINARY:
					ASSERT( FALSE );
					break;
		}
		ASSERT( FALSE );
		return	false;
	}
	catch(_com_error& e)
	{
		TRACE1("%s\n", e.Description());
		return false;
	}
}

unsigned char CDHAdoField::AsChar() const
{
	try
	{
		if(IsNull())
			return ' ';
		switch( GetDBVT() ) 
		{
		case	DBVT_UCHAR:
				return	m_FieldPtr->GetValue().cVal;
		case	DBVT_BOOL:
					return	(m_FieldPtr->GetValue().bVal) ? 'T' : 'F';
		case	DBVT_SHORT:
					return	(unsigned char)m_FieldPtr->GetValue().intVal;
		case	DBVT_LONG:
					return	(unsigned char)m_FieldPtr->GetValue().lVal;
		case	DBVT_SINGLE:
					return	(unsigned char)m_FieldPtr->GetValue().fltVal;
		case    DBVT_DOUBLE:
					return	(unsigned char)m_FieldPtr->GetValue().dblVal;
		case	DBVT_DATE:
					//	Cannot convert date to unsigned char
					ASSERT( FALSE );
					break;
		case DBVT_STRING:
					return	(unsigned char)((m_FieldPtr->GetValue().bstrVal)[0]);
		case DBVT_BINARY:
					//	Cannot convert long binary to unsigned char
					ASSERT( FALSE );
					break;
		}
		//	Undefined data type
		ASSERT( FALSE );
		return	' ';
	}
	catch(_com_error& e)
	{
		TRACE1("%s\n", e.Description());
		return  ' ';
	}
}

COleDateTime CDHAdoField::AsDate() const
{
	COleDateTime	date;
	try
	{
		if( IsNull() ) 
		{
			date.SetStatus( COleDateTime::null );
			return	date;
		}

		switch( GetDBVT() ) 
		{
		case	DBVT_UCHAR:
				date.SetStatus( COleDateTime::invalid );
				return	date;
		case	DBVT_BOOL:
				date.SetStatus( COleDateTime::invalid );
				return	date;
		case	DBVT_SHORT:
				return	COleDateTime( (time_t)m_FieldPtr->GetValue().intVal );
		case	DBVT_LONG:
				return	COleDateTime( (time_t)m_FieldPtr->GetValue().lVal );
		case	DBVT_SINGLE:
				return	COleDateTime( (time_t)m_FieldPtr->GetValue().fltVal );
		case    DBVT_DOUBLE:
				return	COleDateTime( (time_t)m_FieldPtr->GetValue().dblVal );
		case	DBVT_DATE:
				date = COleDateTime(m_FieldPtr->GetValue().date);
				if(date.GetYear() ==0 && date.GetMonth()==0 && date.GetDay()==0)
					date.SetStatus( COleDateTime::null );
				if(date.GetHour()==99 && date.GetMinute()==99 && date.GetSecond()==99)
					date.SetStatus( COleDateTime::null );
				return	date;
		case DBVT_STRING:
				date.ParseDateTime( (char*)(_bstr_t)(m_FieldPtr->GetValue().bstrVal) );		
			return	date;
		case DBVT_BINARY:	
				ASSERT( FALSE );
				break;
		}
		//	Undefined data type
		ASSERT( FALSE );
		date.SetStatus( COleDateTime::invalid );
		return	date;
	}
	catch(_com_error& e)
	{
		TRACE1("%s\n", e.Description());
		date.SetStatus( COleDateTime::invalid );
		return	date;
	}
}

double CDHAdoField::AsDouble() const
{
	try
	{
		if( IsNull() )
			return	0.0;

		switch( GetDBVT() )
		{
		case	DBVT_UCHAR:
				return	(double)m_FieldPtr->GetValue().cVal;
		case	DBVT_BOOL:
					return	(m_FieldPtr->GetValue().bVal) ? 1.0 : 0.0;
		case	DBVT_SHORT:
					return	(double)m_FieldPtr->GetValue().intVal;
		case	DBVT_LONG:
					return	(double)m_FieldPtr->GetValue().lVal;
		case	DBVT_SINGLE:
					return	(double)m_FieldPtr->GetValue().fltVal;
		case    DBVT_DOUBLE:
					return	m_FieldPtr->GetValue().dblVal;
		case	DBVT_DATE:
					//	Cannot convert date to unsigned char
					ASSERT( FALSE );
					break;
		case DBVT_STRING:
					return	atof((char*)(_bstr_t)(m_FieldPtr->GetValue()));
		case DBVT_BINARY:
					//	Cannot convert long binary to unsigned char
					ASSERT( FALSE );
					break;
		}
		//	Undefined data type
		ASSERT( FALSE );
		return	0.0;
	}
	catch(_com_error& e)
	{
		TRACE1("%s\n", e.Description());
		return  0.0;
	}
}

float CDHAdoField::AsFloat() const
{
	try
	{
		if( IsNull() )
			return	0.0;
		switch( GetDBVT() )
		{
		case	DBVT_UCHAR:
				return	(float)m_FieldPtr->GetValue().cVal;
		case	DBVT_BOOL:
					return	(m_FieldPtr->GetValue().bVal) ? 1.0f: 0.0f;
		case	DBVT_SHORT:
					return	(float)m_FieldPtr->GetValue().intVal;
		case	DBVT_LONG:
					return	(float)m_FieldPtr->GetValue().lVal;
		case	DBVT_SINGLE:
					return	m_FieldPtr->GetValue().fltVal;
		case    DBVT_DOUBLE:
					return	(float)m_FieldPtr->GetValue().dblVal;
		case	DBVT_DATE:
					//	Cannot convert date to unsigned char
					ASSERT( FALSE );
					break;
		case DBVT_STRING:
					return	(float)atof((char*)(_bstr_t)(m_FieldPtr->GetValue().bstrVal));
		case DBVT_BINARY:
					//	Cannot convert long binary to unsigned char
					ASSERT( FALSE );
					break;
		}
		//	Undefined data type
		ASSERT( FALSE );
		return	0.0;
	}
	catch(_com_error& e)
	{
		TRACE1("%s\n", e.Description());
		return  0.0;
	}
}

int CDHAdoField::AsInt() const
{
	return AsLong();
}

long CDHAdoField::AsLong() const
{
	try
	{
		COleDateTime date;
		CTime tm;
		if( IsNull() )
			return	0;
		switch( GetDBVT() )
		{
		case	DBVT_UCHAR:
				return	(long)m_FieldPtr->GetValue().cVal;
		case	DBVT_BOOL:
					return	(m_FieldPtr->GetValue().bVal) ? 1 : 0;
		case	DBVT_SHORT:
					return	(long)m_FieldPtr->GetValue().intVal;
		case	DBVT_LONG:
					return	m_FieldPtr->GetValue().lVal;
		case	DBVT_SINGLE:
					return	(long)m_FieldPtr->GetValue().fltVal;
		case    DBVT_DOUBLE:
					return	(long)m_FieldPtr->GetValue().dblVal;
		case	DBVT_DATE:
					date = COleDateTime(m_FieldPtr->GetValue().date);
					if(date.GetYear() ==0 && date.GetMonth()==0 && date.GetDay()==0)
					return (long)0;
					if(date.GetHour()==99 && date.GetMinute()==99 && date.GetSecond()==99)
					return (long)0;
					tm=CTime(date.GetYear(), date.GetMonth(), date.GetDay(),
					date.GetHour(), date.GetMinute(), date.GetSecond());
					return tm.GetTime();
					break;
		case	DBVT_STRING:
					return	atol((char*)m_FieldPtr->GetValue().pbstrVal);
		case	DBVT_BINARY:
					//	Cannot convert long binary to unsigned char
					ASSERT( FALSE );
					break;
		}
		//	Undefined data type
		ASSERT( FALSE );
		return	0;
	}
	catch(_com_error& e)
	{
		TRACE1("%s\n", e.Description());
		return  0;
	}
}

short CDHAdoField::AsShort() const
{
	try
	{
		if( IsNull() )
			return	0;
		switch( GetDBVT() ) 
		{
		case	DBVT_UCHAR:
				return	(short)m_FieldPtr->GetValue().cVal;
		case	DBVT_BOOL:
					return	(m_FieldPtr->GetValue().bVal) ? 1 : 0;
		case	DBVT_SHORT:
					return	m_FieldPtr->GetValue().intVal;
		case	DBVT_LONG:
					return	(short)m_FieldPtr->GetValue().lVal;
		case	DBVT_SINGLE:
					return	(short)m_FieldPtr->GetValue().fltVal;
		case    DBVT_DOUBLE:
					return	(short)m_FieldPtr->GetValue().dblVal;
		case	DBVT_DATE:
					//	Cannot convert date to unsigned char
					ASSERT( FALSE );
					break;
		case DBVT_STRING:
					return	(short)atoi((char*)(_bstr_t)(m_FieldPtr->GetValue().bstrVal));
		case DBVT_BINARY:
					//	Cannot convert long binary to unsigned char
					ASSERT( FALSE );
					break;
		}
		//	Undefined data type
		ASSERT( FALSE );
		return	0;
	}
	catch(_com_error& e)
	{
		TRACE1("%s\n", e.Description());
		return  0;
	}
}

CString CDHAdoField::AsString()
{
	CString	cValue="";
	try
	{
		if( IsNull() )
			return	cValue;
		switch(GetDBVT()) 
		{
		case	DBVT_UCHAR:
			return	CString( m_FieldPtr->GetValue().cVal );
		case	DBVT_BOOL:
				return	CString( m_FieldPtr->GetValue().bVal ? "T" : "F" );
		case	DBVT_SHORT:
				cValue.Format( "%hd", m_FieldPtr->GetValue().intVal );
				return	cValue;
		case	DBVT_LONG:
				cValue.Format( "%ld", m_FieldPtr->GetValue().lVal );
				return	cValue;
		case	DBVT_SINGLE:
				cValue.Format( "%.2f", m_FieldPtr->GetValue().fltVal );
				return	cValue;
		case    DBVT_DOUBLE:
				cValue.Format( "%.2f", m_FieldPtr->GetValue().dblVal );
				return	cValue;
		case	DBVT_DATE:
				cValue.Format( "%s", COleDateTime(m_FieldPtr->GetValue().date).Format("%Y/%m/%d %H:%M:%S"));
				return	cValue;
		case DBVT_STRING:	
				cValue = (char*)((_bstr_t)m_FieldPtr->GetValue());
				cValue.TrimRight();
				return	cValue;

		case DBVT_BINARY:
				::BinaryToString( cValue, *AsBinary(), true );
				return cValue;
		}
		//	Undefined data type
		ASSERT( FALSE );
		return	cValue;
	}
	catch(_com_error& e)
	{
		TRACE1("%s\n", e.Description());
		return  cValue;
	}
}

long CDHAdoField::GetBinaryLen()
{
	try
	{
		if(IsBinary())
			return m_FieldPtr->GetActualSize();
		else
			return -1;
	}
	catch(_com_error& e)
	{
		TRACE1("%s\n", e.Description());
		return -1;
	}
}



BOOL CDHAdoField::DumpToFile(FILE *fp)
{
	try
	{
		DWORD dwSize;
		//写入字段类型
		//fwrite(&m_dwType, 1, sizeof(m_dwType), fp);	
		if(IsNull())
		{
			//写入字段长度
			dwSize=0;
			fwrite(&dwSize, 1, sizeof(dwSize), fp);
			return TRUE;
		}
		bool bval;
		unsigned char cval;
		short sval;
		long lval;
		float fval;
		double dval;
		CString strval;
		CLongBinary *pbinval;
		COleDateTime tmval;
		TIMESTAMP_STRUCT tmstamp;
		switch( GetDBVT() )
		{

⌨️ 快捷键说明

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