ADO wrapper

LiuYinChina 2007-03-30 01:14:22

/********************************************************************
Created: 2007/03/30
Created: 30:3:2007 13:06
Author: 刘胤

Purpose: wrapper for _Recordset
*********************************************************************/

#ifndef AdoRecordSet_H
#define AdoRecordSet_H

#include <AfxDisp.h>
#include <icrsint.h>

#pragma warning(disable:4146)
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "adoEOF"), rename("BOF", "adoBOF")
#pragma warning(default:4146)

namespace AdoUtility
{
class CAdoConnection;

class CAdoRecordSet
{
public:
CAdoRecordSet(BOOL bInit = TRUE);
~CAdoRecordSet();

void Attach(_Recordset *pRecordset);
_Recordset * Detach();

BOOL SetIndex(const CString &strIndex) const;
BOOL GetIndex(CString &strIndex) const;

BOOL Resync(AffectEnum AffectRecords, ResyncEnum ResyncValues) const;

BOOL GetDataMember(CString &strDataMember) const;
BOOL SetDataMember(const CString &strDataMember) const;

BOOL SetStayInSync(BOOL bStayInSync) const;
BOOL GetStayInSync(BOOL &bStayInSync) const;

BOOL GetActiveCommand(IDispatch **ppCmd) const;

BOOL Find(const CString &strFind, long nSkipRecords, SearchDirectionEnum nSearchDirection) const;

BOOL GetMarshalOptions(MarshalOptionsEnum &nMarshalOptions) const;
BOOL SetMarshalOptions(MarshalOptionsEnum nMarshalOptions) const;

BOOL GetSupports(CursorOptionEnum CursorOptions, VARIANT_BOOL &bSupports) const;

BOOL UpdateBatch(AffectEnum AffectRecords) const;
BOOL CancelBatch(AffectEnum AffectRecords) const;

CAdoRecordSet * Clone(LockTypeEnum nLockType) const;
CAdoRecordSet * xClone() const;

BOOL GetPageSize(long &nPageSize) const;
BOOL SetPageSize(long nPageSize) const;

BOOL GetSort(CString &strSort) const;
BOOL SetSort(const CString &strSort) const;

BOOL GetPageCount(long &nPageCount) const;

BOOL xResync(AffectEnum AffectRecords) const;

BOOL Requery(long nOptions) const;

BOOL GetAbsolutePage(PositionEnum &nPosition) const;
BOOL SetAbsolutePage(PositionEnum nPosition) const;

BOOL SetSource(const CString &strSource) const;
BOOL GetSource(CString &strSource) const;

BOOL GetLockType(LockTypeEnum &nLockType) const;
BOOL SetLockType(LockTypeEnum nLockType) const;

BOOL GetCacheSize(long &nCacheSize) const;
BOOL SetCacheSize(long nCacheSize) const;

BOOL GetBookmark(BookmarkEnum &bookmark) const;
BOOL SetBookmark(BookmarkEnum bookmark = adBookmarkFirst) const;

BOOL SetAbsolutePosition(PositionEnum nPosition) const;
BOOL GetAbsolutePosition(PositionEnum &nPosition) const;

BOOL GetCursorLocation(CursorLocationEnum &nCursorLocation) const;
BOOL SetCursorLocation(CursorLocationEnum nCursorLocation = adUseClient) const;

BOOL GetCursorType(CursorTypeEnum &nCursorType) const;
BOOL SetCursorType(CursorTypeEnum nCursorType = adOpenStatic) const;

BOOL GetState(long &nState) const;
BOOL GetStatus(long &nStatus) const;

BOOL GetFieldAttributes(long nIndex, long &nAttributes) const;
BOOL GetFieldAttributes(LPCTSTR pszFieldName, long &nAttributes) const;

BOOL GetFieldType(long nIndex, DataTypeEnum &nDataType) const;
BOOL GetFieldType(LPCTSTR pszFieldName, DataTypeEnum &nDataType) const;

CAdoConnection * GetConnection() const;
BOOL SetAdoConnection(CAdoConnection * const pConnection) const;

BOOL GetEditMode(EditModeEnum &nEditMode) const;

BOOL Open(const CString &strSQL, long nOption = adCmdText, CursorTypeEnum nCursorType = adOpenStatic, LockTypeEnum nLockType = adLockOptimistic) const;
BOOL Cancel() const;
BOOL Close() const;

BOOL IsOpen() const;
BOOL IsBOF(BOOL &bBOF) const;
BOOL IsEOF(BOOL &bEOF) const;

BOOL GetRecordCount(long &nRecordCount) const;
BOOL GetFieldsCount(long &nFieldsCount) const;

BOOL GetMaxRecordCount(long &nMaxRecordCount) const;
BOOL SetMaxRecordCount(long nMaxRecordCount) const;

BOOL MoveFirst() const;
BOOL MoveNext() const;
BOOL MovePrevious() const;
BOOL MoveLast() const;
BOOL Move(long nRecords, const CComVariant &varStartPos = CComVariant((long) adBookmarkFirst)) const;

BOOL GetFieldName(long nIndex, CString &strFieldName) const;

public:
BOOL AddNew() const;
BOOL Update() const;
BOOL CancelUpdate() const;
BOOL Delete(AffectEnum AffectRecords = adAffectCurrent) const;

BOOL GetCollect(long nIndex, bool &bValue) const;
BOOL GetCollect(long nIndex, CString &strValue) const;
BOOL GetCollect(long nIndex, double &dValue) const;
BOOL GetCollect(long nIndex, float &dValue) const;
BOOL GetCollect(long nIndex, long &nValue) const;
BOOL GetCollect(long nIndex, DWORD &dwValue) const;
BOOL GetCollect(long nIndex, int &nValue) const;
BOOL GetCollect(long nIndex, short &nValue) const;
BOOL GetCollect(long nIndex, BYTE &nValue) const;
BOOL GetCollect(long nIndex, COleDateTime &oleValue) const;
BOOL GetCollect(long nIndex, COleCurrency &oleValue) const;

BOOL GetCollect(LPCSTR pszFieldName, bool &bValue) const;
BOOL GetCollect(LPCSTR pszFieldName, CString &strValue) const;
BOOL GetCollect(LPCSTR pszFieldName, double &dValue) const;
BOOL GetCollect(LPCSTR pszFieldName, float &dValue) const;
BOOL GetCollect(LPCSTR pszFieldName, long &nValue) const;
BOOL GetCollect(LPCSTR pszFieldName, DWORD &dwValue) const;
BOOL GetCollect(LPCSTR pszFieldName, int &nValue) const;
BOOL GetCollect(LPCSTR pszFieldName, short &nValue) const;
BOOL GetCollect(LPCSTR pszFieldName, BYTE &nValue) const;
BOOL GetCollect(LPCSTR pszFieldName, COleDateTime &value) const;
BOOL GetCollect(LPCSTR pszFieldName, COleCurrency &value) const;

public:
BOOL PutCollect(long nIndex, LPCTSTR pszValue) const;
BOOL PutCollect(long nIndex, const double &dValue) const;
BOOL PutCollect(long nIndex, const float &dValue) const;
BOOL PutCollect(long nIndex, long nValue) const;
BOOL PutCollect(long nIndex, DWORD nValue) const;
BOOL PutCollect(long nIndex, int nValue) const;
BOOL PutCollect(long nIndex, short nValue) const;
BOOL PutCollect(long nIndex, BYTE nValue) const;
BOOL PutCollect(long nIndex, bool bValue) const;
BOOL PutCollect(long nIndex, const COleDateTime &oleValue) const;
BOOL PutCollect(long nIndex, const COleCurrency &oleValue) const;

BOOL PutCollect(LPCTSTR pszFieldName, LPCTSTR pszValue) const;
BOOL PutCollect(LPCTSTR pszFieldName, const double &dValue) const;
BOOL PutCollect(LPCTSTR pszFieldName, const float &dValue) const;
BOOL PutCollect(LPCTSTR pszFieldName, long nValue) const;
BOOL PutCollect(LPCTSTR pszFieldName, DWORD nValue) const;
BOOL PutCollect(LPCTSTR pszFieldName, int nValue) const;
BOOL PutCollect(LPCTSTR pszFieldName, short nValue) const;
BOOL PutCollect(LPCTSTR pszFieldName, BYTE nValue) const;
BOOL PutCollect(LPCTSTR pszFieldName, bool bValue) const;
BOOL PutCollect(LPCTSTR pszFieldName, const COleDateTime &oleValue) const;
BOOL PutCollect(LPCTSTR pszFieldName, const COleCurrency &oleValue) const;
...全文
447 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
maplewang2011 2012-07-30
  • 打赏
  • 举报
回复
AdoConnection 代码没有呢。
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
以后需再关注,现在先帮你顶一下
leechiyang 2008-03-31
  • 打赏
  • 举报
回复
codeproject上有2个封装ado的代码,一般的功能还能满足。
LiuYinChina 2007-03-30
  • 打赏
  • 举报
回复

CAdoConnection * CAdoRecordSet::GetConnection() const
{
return NULL;
}

BOOL CAdoRecordSet::SetAdoConnection(CAdoConnection * const pAdoConnection) const
{
Close();

CComPtr<_Connection> pConnection;
if (!pAdoConnection->GetConnection(&pConnection)) {
return FALSE;
}

return SUCCEEDED(m_pRecordset->put_ActiveConnection(CComVariant(pConnection)));
}

BOOL CAdoRecordSet::GetEditMode(EditModeEnum &nEditMode) const
{
nEditMode = adEditNone;
if (!IsOpen()) {
return FALSE;
}

return SUCCEEDED(m_pRecordset->get_EditMode(&nEditMode));
}

BOOL CAdoRecordSet::Open(const CString &strSQL, long nOption, CursorTypeEnum nCursorType, LockTypeEnum nLockType) const
{
if (strSQL.IsEmpty()) {
return FALSE;
}

Close();

CComVariant varAdoConnection;
if (FAILED(m_pRecordset->get_ActiveConnection(&varAdoConnection))) {
return FALSE;
}

return SUCCEEDED(m_pRecordset->raw_Open(CComVariant(strSQL), varAdoConnection, nCursorType, nLockType, nOption));
}

BOOL CAdoRecordSet::Close() const
{
if (!IsOpen()) {
return TRUE;
}

return SUCCEEDED(m_pRecordset->raw_Close());
}

BOOL CAdoRecordSet::IsEOF(BOOL &bEOF) const
{
bEOF = FALSE;
if (!IsOpen()) {
return FALSE;
}

VARIANT_BOOL vbEOF = VARIANT_FALSE;
HRESULT hResult = m_pRecordset->get_adoEOF(&vbEOF);
bEOF = (vbEOF == VARIANT_TRUE);
return SUCCEEDED(hResult);
}

BOOL CAdoRecordSet::IsBOF(BOOL &bBOF) const
{
bBOF = FALSE;
if (!IsOpen()) {
return FALSE;
}

VARIANT_BOOL vbBOF = VARIANT_FALSE;
HRESULT hResult = m_pRecordset->get_adoBOF(&vbBOF);
bBOF = (vbBOF == VARIANT_TRUE);
return SUCCEEDED(hResult);
}

BOOL CAdoRecordSet::Cancel() const
{
if (!IsOpen()) {
return FALSE;
}

return SUCCEEDED(m_pRecordset->raw_Cancel());
}

BOOL CAdoRecordSet::GetRecordCount(long &nRecordCount) const
{
nRecordCount = 0L;
if (!IsOpen()) {
return FALSE;
}

if (FAILED(m_pRecordset->get_RecordCount(&nRecordCount)))
return FALSE;

if (nRecordCount >= 0L) {
return TRUE;
}

nRecordCount = 0L;
PositionEnum nAbsolutePosition = adPosUnknown;
if (!GetAbsolutePosition(nAbsolutePosition))
return FALSE;

if (!MoveFirst())
return FALSE;

while (!m_pRecordset->adoEOF) {
nRecordCount++;
m_pRecordset->raw_MoveNext();
}

SetAbsolutePosition(nAbsolutePosition);
return TRUE;
}

BOOL CAdoRecordSet::GetFieldsCount(long &nFieldsCount) const
{
nFieldsCount = 0L;
if (!IsOpen()) {
return FALSE;
}

CComPtr<Fields> pFields;
if (!GetFields(&pFields)) {
return FALSE;
}

return SUCCEEDED(pFields->get_Count(&nFieldsCount));
}

BOOL CAdoRecordSet::GetAbsolutePosition(PositionEnum &nPosition) const
{
nPosition = adPosUnknown;
if (!IsOpen()) {
return FALSE;
}

return SUCCEEDED(m_pRecordset->get_AbsolutePosition(&nPosition));
}

BOOL CAdoRecordSet::MoveFirst() const
{
if (!IsOpen()) {
return FALSE;
}

HRESULT hResult = E_FAIL;
try {
hResult = m_pRecordset->raw_MoveFirst();
}
catch (...) {
// ...
}

return SUCCEEDED(hResult);
}

BOOL CAdoRecordSet::MoveNext() const
{
if (!IsOpen()) {
return FALSE;
}

HRESULT hResult = E_FAIL;
try {
hResult = m_pRecordset->raw_MoveNext();
}
catch (...) {
// ...
}

return SUCCEEDED(hResult);
}

BOOL CAdoRecordSet::GetFieldName(long nIndex, CString &strFieldName) const
{
strFieldName.Empty();
if (!IsOpen()) {
return FALSE;
}

CComPtr<Fields> pFields;
if (!GetFields(&pFields)) {
return FALSE;
}

CComPtr<Field> pField;
if (!GetField(nIndex, &pField)) {
return FALSE;
}

CComBSTR bstrName;
HRESULT hResult = pField->get_Name(&bstrName);
if (FAILED(hResult)) {
return FALSE;
}

strFieldName = bstrName;
return TRUE;
}

BOOL CAdoRecordSet::MovePrevious() const
{
if (!IsOpen()) {
return FALSE;
}

HRESULT hResult = E_FAIL;
try {
hResult = m_pRecordset->raw_MovePrevious();
}
catch (...) {
// ...
}

return SUCCEEDED(hResult);
}

BOOL CAdoRecordSet::MoveLast() const
{
if (!IsOpen()) {
return FALSE;
}

HRESULT hResult = E_FAIL;
try {
hResult = m_pRecordset->raw_MoveLast();
}
catch (...) {
// ...
}

return SUCCEEDED(hResult);
}

BOOL CAdoRecordSet::Move(long nRecords, const CComVariant &varStartPos) const
{
if (!IsOpen()) {
return FALSE;
}

HRESULT hResult = E_FAIL;
try {
hResult = m_pRecordset->raw_Move(nRecords, varStartPos);
}
catch (...) {
// ...
}

return SUCCEEDED(hResult);
}
LiuYinChina 2007-03-30
  • 打赏
  • 举报
回复

/********************************************************************
Created: 2007/03/30
Created: 30:3:2007 13:06
Author: 刘胤

Purpose: wrapper for _Recordset
*********************************************************************/

#include "AdoRecordset.h"
#include "AdoConnection.h"

#include <AfxDisp.h>

namespace AdoUtility
{
COleDateTime Variant2DateTime(const CComVariant &varValue);
COleCurrency Variant2Currency(const CComVariant &varValue);
bool Variant2Bool(const CComVariant &varValue);
BYTE Variant2Byte(const CComVariant &varValue);
short Variant2Short(const CComVariant &varValue);
long Variant2Long(const CComVariant &varValue);
unsigned long Variant2ULong(const CComVariant &varValue);
float Variant2Float(const CComVariant &varValue);
double Variant2Double(const CComVariant &varValue);
CString Variant2String(const CComVariant &varValue);

CAdoRecordSet::CAdoRecordSet(BOOL bInit)
{
if (bInit) {
InitRecordset();
}
}

void CAdoRecordSet::Attach(_Recordset *pRecordset)
{
m_pRecordset = pRecordset;
}

_Recordset * CAdoRecordSet::Detach()
{
return m_pRecordset.Detach();
}

CAdoRecordSet::~CAdoRecordSet()
{
Close();
}

void CAdoRecordSet::InitRecordset()
{
if (m_pRecordset) {
return;
}

m_pRecordset.CoCreateInstance(CComBSTR(_T("ADODB.Recordset")));
}

BOOL CAdoRecordSet::IsOpen() const
{
long nState = -1;
if (!GetState(nState)) {
return FALSE;
}

return (nState == adStateOpen);
}

BOOL CAdoRecordSet::GetState(long &nState) const
{
nState = -1;
if (!m_pRecordset) {
return FALSE;
}

return SUCCEEDED(m_pRecordset->get_State(&nState));
}

BOOL CAdoRecordSet::GetStatus(long &nStatus) const
{
nStatus = -1;
if (!m_pRecordset) {
return FALSE;
}

return SUCCEEDED(m_pRecordset->get_Status(&nStatus));
}

BOOL CAdoRecordSet::SetAbsolutePosition(PositionEnum nPosition) const
{
if (!IsOpen()) {
return FALSE;
}

return SUCCEEDED(m_pRecordset->put_AbsolutePosition(nPosition));
}
LiuYinChina 2007-03-30
  • 打赏
  • 举报
回复

public:
BOOL xSave(const CString &strFileName, PersistFormatEnum PersistFormat) const;
BOOL Save(LPCTSTR strFileName, PersistFormatEnum PersistFormat = adPersistXML) const;
BOOL Load(LPCTSTR strFileName) const;

BOOL AppendChunk(long nIndex, void *pData, unsigned long nBytes) const;
BOOL AppendChunk(LPCTSTR pszFieldName, void *pData, unsigned long nBytes) const;

BOOL GetChunk(Field *pField, void *pData, unsigned long &nBytes) const;
BOOL GetChunk(long nIndex, void *pData, unsigned long &nBytes) const;
BOOL GetChunk(LPCTSTR pszFieldName, void *pData, unsigned long &nBytes) const;

private:
void InitRecordset();

BOOL GetCollect(const CComVariant &varIndex, CComVariant &varValue) const;
BOOL PutCollect(const CComVariant &varIndex, const CComVariant &varValue) const;
BOOL AppendChunk(Field *pField, void *pData, unsigned long nBytes) const;

BOOL GetFieldAttributes(const CComVariant &varIndex, long &nAttributes) const;
BOOL GetFieldType(const CComVariant &varIndex, DataTypeEnum &nDataType) const;

BOOL GetFields(Fields **pFields) const;
BOOL GetField(long nIndex, Field **pField) const;
BOOL GetField(LPCTSTR pszFieldName, Field **pField) const;
BOOL GetField(const CComVariant &varIndex, Field **pField) const;

CComPtr<_Recordset> m_pRecordset;
};
}

#endif

4,018

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧