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;
}