www.pudn.com > 4-5cha.rar > ado.cpp


// ado.cpp : implementation file 
// 
#include "stdafx.h" 
#include "ado.h" 
#include  
///////////////////////////////////////////////////////////////////////////// 
// CADODatabase class 
 
BOOL CADODatabase::Open(LPCTSTR lpstrConnection) 
{ 
	HRESULT hr = S_OK; 
 
	if(IsOpen()) 
		Close(); 
 
	if(strcmp(lpstrConnection, _T("")) != 0) 
		m_strConnection = lpstrConnection; 
 
	ASSERT(!m_strConnection.IsEmpty()); 
 
	try 
	{ 
		hr = m_pConnection->Open(_bstr_t(m_strConnection), "", "", NULL); 
		return hr == S_OK; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
	} 
	return FALSE; 
} 
 
BOOL CADODatabase::Execute(LPCTSTR lpstrExec) 
{ 
	ASSERT(m_pConnection != NULL); 
	ASSERT(strcmp(lpstrExec, _T("")) != 0); 
	 
	try 
	{ 
		m_pConnection->Execute(_bstr_t(lpstrExec), NULL, adExecuteNoRecords); 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
	} 
	return TRUE;	 
} 
 
void CADODatabase::dump_com_error(_com_error &e) 
{ 
	CString ErrorStr; 
	 
	 
	_bstr_t bstrSource(e.Source()); 
	_bstr_t bstrDescription(e.Description()); 
	ErrorStr.Format( "CADODataBase Error\n\tCode = %08lx\n\tCode meaning = %s\n\tSource = %s\n\tDescription = %s\n", 
		e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription ); 
	m_strLastError = _T("Connection String = " + GetConnectionString() + '\n' + ErrorStr); 
	#ifdef _DEBUG 
		AfxMessageBox( ErrorStr, MB_OK | MB_ICONERROR ); 
	#endif	 
} 
 
BOOL CADODatabase::IsOpen() 
{	try 
	{ 
		return (m_pConnection != NULL && (m_pConnection->State & adStateOpen)); 
	} 
	catch (_com_error e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}  
	return FALSE; 
} 
 
void CADODatabase::Close() 
{ 
	try 
	{	if (IsOpen())  
			m_pConnection->Close();		 
	} 
	catch (_com_error e) 
	{ 
		dump_com_error(e); 
	}  
} 
 
long CADODatabase::BeginTransaction() 
{ 
	ASSERT(m_pConnection != NULL); 
	try 
	{ 
		return m_pConnection->BeginTrans(); 
	} 
	catch (_com_error e) 
	{ 
		dump_com_error(e); 
		return -1; 
	}  
	return -1; 
} 
 
BOOL CADODatabase::CommitTransaction() 
{ 
	ASSERT(m_pConnection != NULL); 
	try 
	{ 
		return SUCCEEDED(m_pConnection->CommitTrans()); 
	} 
	catch (_com_error e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}  
	return FALSE; 
} 
 
BOOL CADODatabase::RollbackTransaction() 
{ 
	ASSERT(m_pConnection != NULL); 
	try 
	{ 
		return SUCCEEDED(m_pConnection->RollbackTrans()); 
	} 
	catch (_com_error e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}  
	return FALSE; 
} 
///////////////////////////////////////////////////////////////////////////// 
// CADORecordset class 
 
///////////////////////////////////////////////////////////////////////////// 
//构造函数 
CADORecordset::CADORecordset(CADODatabase* pAdoDatabase) 
{ 
	m_pRecordset = NULL; 
	m_strQuery = _T(""); 
	m_pRecordset.CreateInstance(__uuidof(Recordset)); 
	m_nSearchDirection = CADORecordset::searchForward; 
 
	m_pConnection = pAdoDatabase->GetActiveConnection(); 
} 
///////////////////////////////////////////////////////////////////////////// 
//打开记录集 
BOOL CADORecordset::Open(_ConnectionPtr mpdb, LPCTSTR lpstrExec, int nOption) 
{	 
	if (IsOpen()) Close(); 
	 
	if(strcmp(lpstrExec, _T("")) != 0) 
		m_strQuery = lpstrExec; 
 
	ASSERT(!m_strQuery.IsEmpty()); 
	 
	m_strQuery.TrimLeft(); 
	BOOL bIsSelect = m_strQuery.Mid(0, strlen("Select ")).CompareNoCase("select ") == 0; 
 
	try 
	{ 
		m_pRecordset->CursorLocation = adUseClient; 
		if(bIsSelect || nOption == openQuery) 
			m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*)mpdb, TRUE),  
							adOpenStatic, adLockOptimistic, adCmdText); 
		else if(nOption == openTable) 
			m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*)mpdb, TRUE),  
							adOpenDynamic, adLockOptimistic, adCmdTable); 
		else if(nOption == openStoredProc) 
		{ 
			m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*)mpdb, TRUE),  
				adOpenStatic, adLockOptimistic, adCmdStoredProc); 
		} 
		else 
		{ 
			TRACE( "Unknown parameter. %d", nOption); 
			return FALSE; 
		} 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	} 
	return m_pRecordset != NULL; 
} 
 
BOOL CADORecordset::Open(LPCTSTR lpstrExec, int nOption) 
{ 
	ASSERT(m_pConnection != NULL); 
	return Open(m_pConnection, lpstrExec, nOption); 
} 
 
 
BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, double& dbValue) 
{	 
	double val = (double)NULL; 
	_variant_t vtFld; 
	try 
	{	 
		vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value; 
		if(vtFld.vt != VT_NULL) 
			val = vtFld.dblVal; 
		dbValue = val; 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		dbValue=0; 
		return FALSE; 
	} 
} 
 
 
BOOL CADORecordset::GetFieldValue(int nIndex, double& dbValue) 
{	 
	double val = (double)NULL; 
	_variant_t vtFld; 
	_variant_t vtIndex; 
 
	vtIndex.vt = VT_I2; 
	vtIndex.iVal = nIndex; 
	try 
	{ 
		vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value; 
		if(vtFld.vt != VT_NULL) 
			val = vtFld.dblVal; 
		dbValue = val; 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		dbValue=0; 
		return FALSE; 
	} 
	 
} 
 
 
BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, long& lValue) 
{ 
	long val = (long)NULL; 
	_variant_t vtFld; 
	try 
	{	 
		vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value; 
		if(vtFld.vt != VT_NULL) 
			val = vtFld.lVal; 
		lValue = val; 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		lValue=0; 
		return FALSE; 
	} 
} 
 
BOOL CADORecordset::GetFieldValue(int nIndex, long& lValue) 
{ 
	long val = (long)NULL; 
	_variant_t vtFld; 
	_variant_t vtIndex; 
	 
	vtIndex.vt = VT_I2; 
	vtIndex.iVal = nIndex; 
	try 
	{ 
		vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value; 
		if(vtFld.vt != VT_NULL) 
			val = vtFld.lVal; 
		lValue = val; 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		lValue=0; 
		return FALSE; 
	}	 
} 
 
 
BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, int& nValue) 
{ 
	int val = NULL; 
	_variant_t vtFld; 
	try 
	{ 
		vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value; 
		switch(vtFld.vt) 
		{ 
		case VT_I2: 
			val = vtFld.iVal; 
			break; 
		case VT_BOOL: 
			val = vtFld.boolVal; 
		case VT_NULL: 
		case VT_EMPTY: 
			break; 
		default: 
			nValue = 0; 
			return FALSE; 
		}	 
		nValue = val; 
		return TRUE;		 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		nValue=0; 
		return FALSE; 
	} 
} 
 
BOOL CADORecordset::GetFieldValue(int nIndex, int& nValue) 
{ 
	int val = (int)NULL; 
	_variant_t vtFld; 
	_variant_t vtIndex; 
	 
	vtIndex.vt = VT_I2; 
	vtIndex.iVal = nIndex; 
	try 
	{ 
		vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value; 
		switch(vtFld.vt) 
		{ 
		case VT_I2: 
			val = vtFld.iVal; 
			break; 
		case VT_NULL: 
		case VT_EMPTY: 
			val = 0; 
			break; 
		default: 
			return FALSE; 
		}	 
		nValue = val; 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		nValue=0; 
		return FALSE; 
	} 
	 
} 
 
BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, CString& strValue) 
{ 
	CString str = _T(""); 
	_variant_t vtFld; 
	try 
	{ 
		vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value; 
		switch(vtFld.vt)  
		{ 
		case VT_BSTR: 
			str = vtFld.bstrVal; 
			break; 
		case VT_I4: 
			str = IntToStr(vtFld.iVal); 
			break; 
		case VT_DATE: 
			{ 
				COleDateTime dt(vtFld); 
				 
				str = dt.Format("%Y-%m-%d %H:%M:%S"); 
			} 
			break; 
		case VT_EMPTY: 
		case VT_NULL: 
			break; 
		default: 
			strValue.Empty(); 
			return FALSE; 
		} 
		strValue = str; 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		strValue= _T(""); 
		return FALSE; 
	} 
} 
 
BOOL CADORecordset::GetFieldValue(int nIndex, CString& strValue) 
{ 
	CString str = _T(""); 
	_variant_t vtFld; 
	_variant_t vtIndex; 
 
	vtIndex.vt = VT_I2; 
	vtIndex.iVal = nIndex; 
	try 
	{ 
		vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value; 
		switch(vtFld.vt)  
		{ 
		case VT_BSTR: 
			str = vtFld.bstrVal; 
			break; 
		case VT_DATE: 
			{ 
				COleDateTime dt(vtFld); 
				 
				str = dt.Format("%Y-%m-%d %H:%M:%S"); 
			} 
			break; 
		case VT_EMPTY: 
		case VT_NULL: 
			break; 
		default: 
			strValue.Empty(); 
			return FALSE; 
		} 
		strValue = str; 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		strValue= _T(""); 
		return FALSE; 
	}	 
} 
 
BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, COleDateTime& time) 
{ 
	_variant_t vtFld; 
	try 
	{ 
		vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value; 
		switch(vtFld.vt)  
		{ 
		case VT_DATE: 
			{ 
				COleDateTime dt(vtFld); 
				time = dt; 
			} 
			break; 
		case VT_EMPTY: 
		case VT_NULL: 
			break; 
		default: 
			return FALSE; 
		} 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}	 
} 
 
BOOL CADORecordset::GetFieldValue(int nIndex, COleDateTime& time) 
{ 
	_variant_t vtFld; 
	_variant_t vtIndex; 
	 
	vtIndex.vt = VT_I2; 
	vtIndex.iVal = nIndex; 
	try 
	{ 
		vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value; 
		switch(vtFld.vt)  
		{ 
		case VT_DATE: 
			{ 
				COleDateTime dt(vtFld); 
				time = dt; 
			} 
			break; 
		case VT_EMPTY: 
		case VT_NULL: 
			break; 
		default: 
			return FALSE; 
		} 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}	 
} 
 
/* 
BOOL CADORecordset::IsFieldNull(LPCTSTR lpFieldName) 
{ 
	_variant_t vtFld; 
	 
	vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value; 
	return vtFld.vt == VT_NULL; 
} 
 
BOOL CADORecordset::IsFieldNull(int nIndex) 
{ 
	_variant_t vtFld; 
	_variant_t vtIndex; 
 
	vtIndex.vt = VT_I2; 
	vtIndex.iVal = nIndex; 
	 
	vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value; 
	return vtFld.vt == VT_NULL; 
} 
 
BOOL CADORecordset::IsFieldEmpty(LPCTSTR lpFieldName) 
{ 
	_variant_t vtFld; 
	 
	vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value; 
	return vtFld.vt == VT_EMPTY || vtFld.vt == VT_NULL; 
} 
 
BOOL CADORecordset::IsFieldEmpty(int nIndex) 
{ 
	_variant_t vtFld; 
	_variant_t vtIndex; 
	 
	vtIndex.vt = VT_I2; 
	vtIndex.iVal = nIndex; 
		 
	vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value; 
	return vtFld.vt == VT_EMPTY || vtFld.vt == VT_NULL; 
}*/ 
 
///////////////////////////////////////////////////////////////////////////// 
//获得记录数目 
DWORD CADORecordset::GetRecordCount() 
{ 
	DWORD nRows = 0; 
	try{	 
		nRows = m_pRecordset->GetRecordCount(); 
		//如果提供者不支持计算记录个数,则通过遍历计算 
		if(nRows == -1) 
		{ 
			nRows = 0; 
			if(m_pRecordset->adoEOF != VARIANT_TRUE) 
				m_pRecordset->MoveFirst(); 
			while(m_pRecordset->adoEOF != VARIANT_TRUE) 
				{ 
					nRows++; 
					m_pRecordset->MoveNext(); 
				} 
			if(nRows > 0) 
				m_pRecordset->MoveFirst(); 
		} 
	} 
	catch (_com_error& e) 
		{ 
			dump_com_error(e); 
			return -1; 
		}	 
	return nRows; 
} 
 
BOOL CADORecordset::IsOpen() 
{ 
	try 
	{ 
		if(m_pRecordset) 
			return m_pRecordset->GetState() != adStateClosed; 
	} 
	catch (_com_error e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}  
	return FALSE; 
} 
 
void CADORecordset::Close() 
{	try 
	{ 
		if (m_pRecordset != NULL && m_pRecordset->State != adStateClosed) 
				m_pRecordset->Close(); 
	} 
	catch (_com_error& e) 
	{dump_com_error(e);}	 
} 
 
void CADORecordset::dump_com_error(_com_error &e) 
{ 
	CString ErrorStr; 
	 
	 
	_bstr_t bstrSource(e.Source()); 
	_bstr_t bstrDescription(e.Description()); 
	ErrorStr.Format( "CADORecordset Error\n\tCode = %08lx\n\tCode meaning = %s\n\tSource = %s\n\tDescription = %s\n", 
		e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription ); 
	m_strLastError = _T("Query = " + GetQuery() + '\n' + ErrorStr); 
 
	#ifdef _DEBUG 
		AfxMessageBox( ErrorStr, MB_OK | MB_ICONERROR ); 
	#endif	 
} 
 
 
long CADORecordset::GetAbsolutePosition() 
{ 
	ASSERT(m_pRecordset != NULL);	 
	try 
	{ 
		return m_pRecordset->GetAbsolutePosition(); 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return -1; 
	} 
} 
 
CString IntToStr(int nVal) 
{ 
	CString strRet; 
	char buff[10]; 
	 
	itoa(nVal, buff, 10); 
	strRet = buff; 
	return strRet; 
} 
 
CString LongToStr(long lVal) 
{ 
	CString strRet; 
	char buff[20]; 
	 
	ltoa(lVal, buff, 10); 
	strRet = buff; 
	return strRet; 
} 
///////////////////////////////////////////////////////////////////////////// 
//添加记录、更新记录 
BOOL CADORecordset::AddNew() 
{ 
	try 
	{ 
		if(m_pRecordset->AddNew() != S_OK) 
			return FALSE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	} 
	return TRUE; 
} 
 
BOOL CADORecordset::Update() 
{ 
	try 
	{ 
		if(m_pRecordset->Update() != S_OK) 
			return FALSE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	} 
	return TRUE; 
} 
 
 
BOOL CADORecordset::SetFieldValue(int nIndex, CString strValue) 
{ 
	_variant_t vtFld; 
	vtFld.vt = VT_BSTR; 
	vtFld.bstrVal = _bstr_t(strValue); 
 
	_variant_t vtIndex;	 
	vtIndex.vt = VT_I2; 
	vtIndex.iVal = nIndex; 
	try 
	{ 
		m_pRecordset->Fields->GetItem(vtIndex)->Value = _bstr_t(vtFld);//_bstr_t(strValue); 
		return TRUE; 
	}	 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}	 
} 
 
BOOL CADORecordset::SetFieldValue(LPCTSTR lpFieldName, CString strValue) 
{ 
	_variant_t vtFld; 
	vtFld.vt = VT_BSTR; 
	vtFld.bstrVal = _bstr_t(strValue); 
	try 
	{ 
		m_pRecordset->Fields->GetItem(lpFieldName)->Value = _bstr_t(vtFld); 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}		 
} 
 
BOOL CADORecordset::SetFieldValue(int nIndex, int nValue) 
{ 
	_variant_t vtFld; 
	vtFld.vt = VT_I2; 
	vtFld.iVal = nValue; 
	 
	_variant_t vtIndex; 
	 
	vtIndex.vt = VT_I2; 
	vtIndex.iVal = nIndex; 
	try 
	{ 
		m_pRecordset->Fields->GetItem(vtIndex)->Value = vtFld; 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}		 
} 
 
BOOL CADORecordset::SetFieldValue(LPCTSTR lpFieldName, int nValue) 
{ 
	_variant_t vtFld; 
	vtFld.vt = VT_I2; 
	vtFld.iVal = nValue; 
	try 
	{ 
		m_pRecordset->Fields->GetItem(lpFieldName)->Value = vtFld; 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}		 
} 
 
BOOL CADORecordset::SetFieldValue(int nIndex, long lValue) 
{ 
	_variant_t vtFld; 
	vtFld.vt = VT_I4; 
	vtFld.lVal = lValue; 
	 
	_variant_t vtIndex; 
	 
	vtIndex.vt = VT_I2; 
	vtIndex.iVal = nIndex; 
	try 
	{ 
		m_pRecordset->Fields->GetItem(vtIndex)->Value = vtFld; 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}		 
} 
 
BOOL CADORecordset::SetFieldValue(LPCTSTR lpFieldName, long lValue) 
{ 
	_variant_t vtFld; 
	vtFld.vt = VT_I4; 
	vtFld.lVal = lValue; 
	try 
	{ 
		m_pRecordset->Fields->GetItem(lpFieldName)->Value = vtFld; 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}		 
} 
 
BOOL CADORecordset::SetFieldValue(int nIndex, double dblValue) 
{ 
	_variant_t vtFld; 
	vtFld.vt = VT_R8; 
	vtFld.dblVal = dblValue; 
 
	_variant_t vtIndex; 
	 
	vtIndex.vt = VT_I2; 
	vtIndex.iVal = nIndex; 
	try 
	{ 
		m_pRecordset->Fields->GetItem(vtIndex)->Value = vtFld; 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}		 
} 
 
BOOL CADORecordset::SetFieldValue(LPCTSTR lpFieldName, double dblValue) 
{ 
	_variant_t vtFld; 
	vtFld.vt = VT_R8; 
	vtFld.dblVal = dblValue; 
	try 
	{ 
		m_pRecordset->Fields->GetItem(lpFieldName)->Value = vtFld; 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}	 
} 
 
BOOL CADORecordset::SetFieldValue(int nIndex, COleDateTime time) 
{ 
	_variant_t vtFld; 
	vtFld.vt = VT_DATE; 
	vtFld.date = time; 
	 
	_variant_t vtIndex; 
	 
	vtIndex.vt = VT_I2; 
	vtIndex.iVal = nIndex; 
	try 
	{ 
		m_pRecordset->Fields->GetItem(vtIndex)->Value = vtFld; 
		return TRUE; 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}	 
} 
 
BOOL CADORecordset::SetFieldValue(LPCTSTR lpFieldName, COleDateTime time) 
{ 
	_variant_t vtFld; 
	vtFld.vt = VT_DATE; 
	vtFld.date = time; 
	try 
	{ 
		m_pRecordset->Fields->GetItem(lpFieldName)->Value = vtFld; 
		return TRUE;	 
	} 
	catch(_com_error &e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	} 
} 
 
BOOL CADORecordset::SetBookmark() 
{ 
	if(m_varBookmark.vt != VT_EMPTY) 
	{ 
		m_pRecordset->Bookmark = m_varBookmark; 
		return TRUE; 
	} 
	return FALSE; 
} 
 
void CADORecordset::GetBookmark() 
{ 
	ASSERT(m_pRecordset != NULL); 
	try 
	{ 
		if (IsOpen())		 
			m_varBookmark = m_pRecordset->GetBookmark();			 
	} 
	catch (_com_error e) 
	{dump_com_error(e);} 
} 
 
BOOL CADORecordset::Delete() 
{ 
	if(m_pRecordset->Delete(adAffectCurrent) != S_OK) 
		return FALSE; 
 
	if(m_pRecordset->Update() != S_OK) 
		return FALSE; 
 
	return TRUE; 
} 
 
BOOL CADORecordset::Find(LPCTSTR lpFind, int nSearchDirection) 
{ 
	m_strFind = lpFind; 
	m_nSearchDirection = nSearchDirection; 
	ASSERT(!m_strFind.IsEmpty()); 
	try 
	{ 
		if(m_nSearchDirection == searchForward) 
		{ 
			m_pRecordset->Find(_bstr_t(m_strFind), 0, adSearchForward, ""); 
			if(!IsEOF()) 
			{ 
				//m_varBookFind = m_pRecordset->Bookmark; 
				return TRUE; 
			} 
		} 
		else if(m_nSearchDirection == searchBackward) 
		{	 
			m_pRecordset->Find(_bstr_t(m_strFind), 0, adSearchBackward, ""); 
			if(!IsBOF()) 
			{ 
				//m_varBookFind = m_pRecordset->Bookmark; 
				return TRUE; 
			}				 
		} 
		else 
		{ 
			TRACE("Unknown parameter. %d", nSearchDirection); 
			m_nSearchDirection = searchForward; 
		} 
		return FALSE; 
	} 
	catch(_com_error e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	} 	 
} 
 
 
BOOL CADORecordset::IsBOF() 
{ 
	ASSERT(m_pRecordset != NULL); 
	try 
	{ 
		return m_pRecordset->adoBOF; 
	} 
	catch(_com_error e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}  
	return FALSE; 
} 
 
BOOL CADORecordset::IsEOF() 
{ 
	ASSERT(m_pRecordset != NULL); 
	try 
	{ 
		return ((m_pRecordset->adoEOF)==VARIANT_TRUE); 
	} 
	catch (_com_error e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	} 
} 
 
BOOL CADORecordset::MoveFirst() 
{ 
	ASSERT(m_pRecordset != NULL); 
	try 
	{ 
		if (m_pRecordset != NULL)  
		{ 
			return SUCCEEDED(m_pRecordset->MoveFirst()); 
		} 
	} 
	catch (_com_error e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}  
	return	FALSE; 
} 
 
BOOL CADORecordset::MoveNext() 
{ 
	ASSERT(m_pRecordset != NULL); 
	try 
	{ 
		if (m_pRecordset != NULL)  
		{ 
			return SUCCEEDED(m_pRecordset->MoveNext()); 
		} 
	} 
	catch (_com_error e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	} 
	return FALSE; 
} 
BOOL CADORecordset::MovePrevious() 
{ 
	ASSERT(m_pRecordset != NULL); 
	try 
	{ 
		if (m_pRecordset != NULL)  
		{ 
			return SUCCEEDED(m_pRecordset->MovePrevious()); 
		} 
	} 
	catch (_com_error e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	} 
	return FALSE;	 
} 
BOOL CADORecordset::MoveLast() 
{ 
	ASSERT(m_pRecordset != NULL); 
	try 
	{ 
		if (m_pRecordset != NULL)  
		{ 
			return SUCCEEDED(m_pRecordset->MoveLast()); 
		} 
	} 
	catch (_com_error e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}  
	return	FALSE; 
} 
 
BOOL CADORecordset::Requery(long Options) 
{ 
	ASSERT(m_pRecordset != NULL); 
	try 
	{ 
		if (m_pRecordset != NULL)  
		{ 
			return (m_pRecordset->Requery(Options) == S_OK); 
		} 
	} 
	catch (_com_error e) 
	{ 
		dump_com_error(e); 
		return FALSE; 
	}  
	return	FALSE;  
}