📄 vorecordset.cpp
字号:
// VORecordSet.cpp: implementation of the CVORecordSet class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "VORecordSet.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#ifndef TRACE
#define TRACE(s) OutputDebugString(s)
#else
#ifndef TRACE
#define TRACE(s)
#endif
#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.1");
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);
if(FAILED(hr))
{
// AfxMessageBox(_T("recordset failed"));
CString info;
info.Format(_T("%8x"), hr);
AfxMessageBox(info);
return;
}
VARIANT varConn;
// If Connection object is using CEDB instead of a .CDB filename, use it
// as a persistent connection. For .CDB filenames, each recordset Open()
// requires its own connection unfortunately.
if((_Connection*)m_rConn)
{
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;
if(IsOpen())
m_rs->Close();
//hr = m_rs->Open(_variant_t(pcszSource), _variant_t( m_rConn.GetProvider() ), CursorType, LockType, adCmdUnknown);
hr = m_rs->Open(_variant_t(pcszSource), _variant_t( m_rConn.GetProvider() ), CursorType, LockType, adCmdUnknown);
m_fIsOpen = (!FAILED(hr));
if(m_fIsOpen)
{
m_rs->get_Fields(&m_Fields);
m_Fields->get_Count(&m_FldCnt);
}
else
{
// CString info;
// info = pcszSource;
// AfxMessageBox(_T("err : ") + info);
}
return m_fIsOpen;
}
BOOL CVORecordSet::Close()
{
if(!m_rs)
{
TRACE(TEXT("CVORecordSet::Close() RecordSet COM Object not initialized\n"));
return FALSE;
}
if(IsOpen() )
{
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));
}
BOOL CVORecordSet::MoveTo(int pos)
{
if(!m_rs)
{
TRACE(TEXT("CVORecordSet::MoveNext() RecordSet COM Object not initialized\n"));
return FALSE;
}
/* _variant_t bookmark;
bookmark.vt=VT_I4;
bookmark.lVal=adBookmarkFirst;
HRESULT hr = m_rs->Move(pos,bookmark);
*/
HRESULT hr = m_rs->put_AbsolutePosition(pos);
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)
{
if(!m_rs)
{
TRACE(TEXT("CVORecordSet::GetFieldName() RecordSet COM Object not initialized\n"));
return NULL;
}
Field* pField = GetField(iField);
if(!pField)
{
TRACE(TEXT("CVORecordSet::GetFieldName() Invalid Field Index\n"));
return NULL;
}
m_varFieldName = TEXT("Empty");
pField->get_Name(&m_varFieldName.bstrVal);
if(m_varFieldName.vt != VT_BSTR)
VariantChangeType(&m_varFieldName, &m_varFieldName, 0, VT_BSTR);
return m_varFieldName.bstrVal;
}
VARIANT CVORecordSet::GetFieldValue(int iField)
{
if(!m_rs)
{
TRACE(TEXT("CVORecordSet::GetFieldValue() RecordSet COM Object not initialized\n"));
return _variant_t(0L);
}
HRESULT hr;
m_varFieldValue = TEXT("Empty");
Field* pField = GetField(iField);
if(!pField)
{
TRACE(TEXT("CVORecordSet::GetFieldValue() Invalid Field Index\n"));
return _variant_t(0L);
}
hr = pField->get_Value(&m_varFieldValue);
return m_varFieldValue;
}
LPCTSTR CVORecordSet::GetFieldValueString(int iField)
{
if(!m_rs)
{
TRACE(TEXT("CVORecordSet::GetFieldValueString() RecordSet COM Object not initialized\n"));
return NULL;
}
_variant_t value = GetFieldValue(iField);
m_varFieldValue = TEXT(""); // modified by wh from 'Empty' to ''
if(value.vt == VT_BSTR)
m_varFieldValue = value;
else
VariantChangeType(&m_varFieldValue, &value, 0, VT_BSTR);
return m_varFieldValue.bstrVal;
}
BOOL CVORecordSet::SetFieldValue(int iField, VARIANT value)
{
if(!m_rs)
{
TRACE(TEXT("CVORecordSet::SetFieldValue() RecordSet COM Object not initialized\n"));
return FALSE;
}
HRESULT hr;
Field* pField = GetField(iField);
if(!pField)
{
TRACE(TEXT("CVORecordSet::SetFieldValue() Invalid Field Index\n"));
return FALSE;
}
pField = GetField(iField);
hr = pField->put_Value(value);
_variant_t varFieldName(GetFieldName(iField));
hr = m_rs->Update(varFieldName, value);
return !FAILED(hr);
}
BOOL CVORecordSet::SetFieldValue(LPCTSTR pcszFieldName, VARIANT value)
{
if(!m_rs)
{
TRACE(TEXT("CVORecordSet::SetFieldValue() RecordSet COM Object not initialized\n"));
return FALSE;
}
CVOString strFieldName(pcszFieldName);
for(int iFieldIndex = 0; iFieldIndex < GetFieldCount(); iFieldIndex++)
{
if(strFieldName == GetFieldName(iFieldIndex))
return SetFieldValue(iFieldIndex, value);
}
return FALSE;
}
long CVORecordSet::GetRecordCount()
{
if(!m_rs)
{
TRACE(TEXT("CVORecordset::GetRecordCount() RecordSet COM Object not initialized\n"));
return 0;
}
long RecCnt = 0;
HRESULT hr = m_rs->get_RecordCount(&RecCnt);
if( !FAILED(hr) )
return RecCnt;
return 0;
}
bool CVORecordSet::DropAllTables()
{
return true;
}
bool CVORecordSet::GetAllTablesNames(CStringArray & tablenames)
{
return true;
}
//////////////////////////////////////////////////////////////////////////
CMutexRecordSet::CMutexRecordSet(CVOConnection& rConn):CVORecordSet(rConn)
{
InitializeCriticalSection(&m_CriticalSection);
}
CMutexRecordSet::~CMutexRecordSet()
{
DeleteCriticalSection(&m_CriticalSection);
}
BOOL CMutexRecordSet::OpenMutex(LPCTSTR pcszSource, enum CursorTypeEnum CursorType /* = adOpenForwardOnly */, enum LockTypeEnum LockType /* = adLockReadOnly */)
{
EnterCriticalSection(&m_CriticalSection);
BOOL bResult = Open(pcszSource, CursorType, LockType);
LeaveCriticalSection(&m_CriticalSection);
return bResult;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -