www.pudn.com > sqlcommand.zip > VORecordset.cpp


//------------------------------------------------------------------- 
// VORecordset implementation 
//------------------------------------------------------------------- 
//  
// Copyright ©2000 Virtual Office Systems Incorporated 
// All Rights Reserved                       
// 
// This code may be used in compiled form in any way you desire. This 
// file may be redistributed unmodified by any means PROVIDING it is  
// not sold for profit without the authors written consent, and  
// providing that this notice and the authors name is included. 
// 
// This code can be compiled, modified and distributed freely, providing 
// that this copyright information remains intact in the distribution. 
// 
// This code may be compiled in original or modified form in any private  
// or commercial application. 
// 
// This file is provided "as is" with no expressed or implied warranty. 
// The author accepts no liability for any damage, in any form, caused 
// by this code. Use it at your own risk. 
//------------------------------------------------------------------- 
 
#include "stdafx.h" 
#include "SQLCommand.h" 
#include "VORecordset.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
const IID IID__Recordset = { 0x113033f6, 0xf682, 0x11d2,	{ 0xbb, 0x62, 0x00, 0xc0, 0x4f, 0x68, 0x0a, 0xcc}}; 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
BOOL	CVORecordset::g_Init = FALSE; 
CLSID	CVORecordset::g_ClsID; 
TCHAR*	CVORecordset::g_ProgID = TEXT("ADOCE.Recordset.3.0"); 
 
CVORecordset::CVORecordset(CVOConnection& rConn) : m_rConn(rConn), m_rs(NULL) 
{ 
	if(!g_Init) 
		Initialize(); 
 
	HRESULT hr; 
 
	hr = CoCreateInstance(g_ClsID, NULL, CLSCTX_INPROC_SERVER, IID__Recordset, (LPVOID*)&m_rs); 
 
	VARIANT	varConn; 
 
	varConn.pdispVal = (_Connection*)m_rConn; 
	varConn.vt = VT_DISPATCH; 
	hr = m_rs->put_ActiveConnection(varConn); 
} 
 
CVORecordset::~CVORecordset() 
{ 
	Close(); 
	if(m_rs) 
		m_rs->Release(); 
} 
 
BOOL CVORecordset::Initialize() 
{ 
	HRESULT hr; 
 
	hr = CLSIDFromProgID( g_ProgID, &g_ClsID); 
 
	return(!FAILED(hr)); 
} 
 
BOOL CVORecordset::Open(LPCTSTR pcszSource, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType) 
{ 
	if(!m_rs) 
	{ 
		TRACE(TEXT("CVORecordset::Open() RecordSet COM Object not initialized\n")); 
		return FALSE; 
	} 
 
	HRESULT hr; 
 
	m_rs->Close(); 
	hr = m_rs->Open(_variant_t(pcszSource), _variant_t(TEXT("")), CursorType, LockType, adCmdUnknown); 
 
	m_fIsOpen = (!FAILED(hr)); 
 
	m_rs->get_Fields(&m_Fields); 
	m_Fields->get_Count(&m_FldCnt); 
 
	return m_fIsOpen; 
} 
 
BOOL CVORecordset::Close() 
{ 
	if(!m_rs) 
	{ 
		TRACE(TEXT("CVORecordset::Close() RecordSet COM Object not initialized\n")); 
		return FALSE; 
	} 
 
	m_rs->Close(); 
 
	m_fIsOpen = FALSE; 
	return TRUE; 
} 
 
BOOL CVORecordset::IsBOF() 
{ 
	if(!m_rs) 
	{ 
		TRACE(TEXT("CVORecordset::BOF() RecordSet COM Object not initialized\n")); 
		return FALSE; 
	} 
 
	VARIANT_BOOL	fValue; 
	HRESULT			hr = m_rs->get_BOF(&fValue); 
 
	return (fValue == VARIANT_TRUE); 
} 
 
BOOL CVORecordset::IsEOF() 
{ 
	if(!m_rs) 
	{ 
		TRACE(TEXT("CVORecordset::EOF() RecordSet COM Object not initialized\n")); 
		return FALSE; 
	} 
 
	VARIANT_BOOL	fValue; 
	HRESULT			hr = m_rs->get_EOF(&fValue); 
 
	return (fValue == VARIANT_TRUE); 
} 
 
BOOL CVORecordset::MoveFirst() 
{ 
	if(!m_rs) 
	{ 
		TRACE(TEXT("CVORecordset::MoveFirst() RecordSet COM Object not initialized\n")); 
		return FALSE; 
	} 
 
	HRESULT hr = m_rs->MoveFirst(); 
 
	return (!FAILED(hr)); 
} 
 
BOOL CVORecordset::MoveNext() 
{ 
	if(!m_rs) 
	{ 
		TRACE(TEXT("CVORecordset::MoveNext() RecordSet COM Object not initialized\n")); 
		return FALSE; 
	} 
 
	HRESULT hr = m_rs->MoveNext(); 
 
	return (!FAILED(hr)); 
} 
 
Field* CVORecordset::GetField(int iField) 
{ 
	if(!m_rs) 
	{ 
		TRACE(TEXT("CVORecordset::GetField() RecordSet COM Object not initialized\n")); 
		return NULL; 
	} 
 
	HRESULT hr = m_Fields->get_Item(_variant_t((long)iField), &m_Field); 
 
	if(FAILED(hr)) 
		return NULL; 
 
	return m_Field; 
} 
 
LPCTSTR CVORecordset::GetFieldName(int iField) 
{ 
	Field* pField = GetField(iField); 
 
	if(!pField) 
	{ 
		TRACE(TEXT("CVORecordset::GetFieldName() Invalid Field Index\n")); 
		return NULL; 
	} 
 
	BSTR	strFieldName; 
 
	pField->get_Name(&strFieldName); 
 
	return strFieldName; 
} 
 
VARIANT CVORecordset::GetFieldValue(int iField) 
{ 
	VARIANT value; 
	HRESULT hr; 
 
	VariantInit(&value); 
 
	Field* pField = GetField(iField); 
 
	if(!pField) 
	{ 
		TRACE(TEXT("CVORecordset::GetFieldValue() Invalid Field Index\n")); 
		return _variant_t((long)0); 
	} 
 
	pField = GetField(iField); 
	hr = pField->get_Value(&value); 
 
	return value; 
} 
 
LPCTSTR CVORecordset::GetFieldValueString(int iField) 
{ 
	VARIANT value = GetFieldValue(iField); 
	VARIANT valueString; 
 
	VariantInit(&valueString); 
 
	if(value.vt == VT_BSTR) 
		valueString = value; 
	else 
		VariantChangeType(&valueString, &value, 0, VT_BSTR); 
 
	return valueString.bstrVal; 
}