7. DBRecordSet.h
#pragma once
#include <comutil.h> #pragma comment(lib,"comsupp.lib")
class CDBRecordSetImpl ; class CDBConnection ;
class AFX_EXT_CLASS CDBRecordSet { //构造函数和析构函数 public: CDBRecordSet(void); virtual ~CDBRecordSet(void);
//接口函数 public:
/* * 打开记录集 * [in] szSQL -> SQL语句, select ...... * [out] rConnection -> 本次查询使用的数据库连接 */ BOOL Open(LPCTSTR szSQL,CDBConnection& rConnection) ;
//记录集是否处于打开状态 BOOL IsOpened() ;
//关闭记录集 BOOL Close(void) ;
//是否记录当前位置位于最后一条记录后面 BOOL IsEof(void);
//是否当前位置位于第一条记录前面 BOOL IsBof(void);
/* * 获取记录总数 * 返回值: * -1 -> 错误 * >=0 -> 记录数 */ int GetRecordCount(void) ;
//移动到第一个记录 BOOL MoveFirst(void) ;
//移到下一个记录 BOOL MoveNext(void) ;
//移动到最后一个记录 BOOL MoveLast(void) ;
//移动到前一个记录 BOOL MovePrevious(void) ;
/* * 移动到指定记录 * 参数: * [in] nOffset -> 相对当前位置移动nOffset个记录,nOffset < 0 表示向前移动,nOffset > 0表示向后移动 */ BOOL Move(int nOffset) ;
/* * 获取当前记录集中的列总数 * -1 -> 错误 * >=0 -> 列总数 */ int GetFieldCount(void) ;
/* 获取列号,从0开始 参数 [in] szFieldName 列名 返回值 列号,-1表示没有找到 */ int GetFieldOrder(LPCTSTR szFieldName) ;
/* 获取列名 参数 [in] nFieldOrder列号,从0开始 返回值 列名 , 返回空串表示没有该序号对应的字段 */ LPCTSTR GetFieldName(int nFieldOrder) ;
/* 获取列值,返回字符串,若是日期,则按照数据库默认的日期格式返回 参数 [in] nFieldOrder -> 列号,从0开始 [out] strValue -> 返回该序号对应的字段值的字符串 返回值: TRUE 字段值成功获取 FALSE 获取字段值失败 */ BOOL GetFieldValue(int nFieldOrder,CString& strValue);
/* 获取列值,返回字符串,若是日期,则按照数据库默认的日期格式返回 参数: [in] nFieldOrder -> 列号,从0开始 返回值: 列值, 返回空串表示没有该序号对应的字段值或者该字段值为空 */ LPCTSTR GetFieldValue(int nFieldOrder);
/* 获取列值,返回整型,若字段不是整型或者可以转换为整型的字段,则返回失败 参数 [in] nFieldOrder -> 列号,从0开始 [out] nValue -> 返回该序号对应的字段值的整型值 返回值: TRUE 字段值成功获取 FALSE 获取字段值失败 */ BOOL GetFieldValueInt(int nFieldOrder,int& nValue);
/* 获取列值,返回整型,若字段不是整型或者可以转换为整型的字段,则返回失败 参数: [in] nFieldOrder -> 列号,从0开始 返回值: 列值, 返回值不检查是否成功 */ int GetFieldValueInt(int nFieldOrder);
/* 获取列值,返回浮点型,若字段不是浮点型或者可以转换为浮点型的字段,则返回失败 参数 [in] nFieldOrder -> 列号,从0开始 [out] nValue -> 返回该序号对应的字段值的浮点型值 返回值: TRUE 字段值成功获取 FALSE 获取字段值失败 */ BOOL GetFieldValueFloat(int nFieldOrder,float& fValue);
/* 获取列值,返回浮点型,若字段不是浮点型或者可以转换为浮点型的字段,则返回失败 参数: [in] nFieldOrder -> 列号,从0开始 返回值: 列值, 返回值不检查是否成功 */ float GetFieldValueFloat(int nFieldOrder);
/* * 设置错误信息 * 参数: * [in] szErrMsg -> 错误信息 * [in] szSourceFile -> 发生错误的源文件 * [in] nLine -> 发生错误的行号 */ void SetErrorMessage(LPCTSTR szErrMsg,const char* szSourceFile=NULL,int nLine=0);
//获取错误信息 LPCTSTR GetErrorMessage(void) const;
//记录集的复制采用clone的方法,当一个记录集被复制以后,得到两个独立的记录集, //其中一个关闭以后,另外一个仍然可用。 public: //copy 构造函数 CDBRecordSet(const CDBRecordSet& rRecordSet) ;
//赋值运算符 CDBRecordSet& operator= (const CDBRecordSet& rRecordSet);
protected: CDBRecordSetImpl* m_pRecordSetImpl ; //临时字段名值 CString m_strTempFieldName ; //临时字段名 CString m_strTempFieldValue ; }; //////////////////////////////////////////////////////////// 8. DBRecordSet.cpp
#include "StdAfx.h" #include "dbrecordset.h" #include "DBErrorMsgDefs.h" #include "DBRecordSetImpl.h" #include "DBConnection.h"
#define DBRECORDSETPtr m_pRecordSetImpl->GetRecordSet()
CDBRecordSet::CDBRecordSet(void) { m_pRecordSetImpl = new CDBRecordSetImpl() ; }
CDBRecordSet::~CDBRecordSet(void) { if(m_pRecordSetImpl) { delete m_pRecordSetImpl ; m_pRecordSetImpl = NULL ; } }
//copy 构造函数 CDBRecordSet::CDBRecordSet(const CDBRecordSet& rRecordSet) : m_pRecordSetImpl(NULL) { *this = rRecordSet ; }
//赋值运算符 CDBRecordSet& CDBRecordSet::operator= (const CDBRecordSet& rRecordSet) { if(this == &rRecordSet) { return *this ; } if(rRecordSet.m_pRecordSetImpl == NULL) { if(m_pRecordSetImpl != NULL) { delete m_pRecordSetImpl ; m_pRecordSetImpl = NULL ; } } else { if(m_pRecordSetImpl == NULL) { m_pRecordSetImpl = new CDBRecordSetImpl() ; } *m_pRecordSetImpl = *rRecordSet.m_pRecordSetImpl ; //copy it } return *this ; }
void CDBRecordSet::SetErrorMessage(LPCTSTR szErrMsg,const char* szSourceFile,int nLine) { m_pRecordSetImpl->SetErrorMessage(szErrMsg,szSourceFile,nLine) ; }
LPCTSTR CDBRecordSet::GetErrorMessage(void) const { return (LPCTSTR)m_pRecordSetImpl->GetErrorMessage() ; }
BOOL CDBRecordSet::Open(LPCTSTR szSQL,CDBConnection& rConnection) { if(szSQL == NULL) { SetErrorMessage(SQL_EMPTYSQL,__FILE__,__LINE__) ; return FALSE ; } else if(_tcslen(szSQL) == 0) { SetErrorMessage(SQL_EMPTYSQL,__FILE__,__LINE__) ; return FALSE ; }
//check if is connected if(!rConnection.IsOpened()) { SetErrorMessage(CONNCTION_NOTCONNECT,__FILE__,__LINE__) ; return FALSE ; }
try { if (!m_pRecordSetImpl->isValid()) { SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ; return FALSE ; }
//check if is already opened if(DBRECORDSETPtr->GetState() != adStateClosed) { //if is opened,close it first DBRECORDSETPtr->Close() ; }
_variant_t vActiveConnection ; if(!rConnection.GetConnectionIDispatch(vActiveConnection)) { SetErrorMessage(CONNCTION_IDISPATCHERROR,__FILE__,__LINE__) ; return FALSE ; }
DBRECORDSETPtr->CursorLocation = adUseClient ; HRESULT hr = DBRECORDSETPtr->Open( _variant_t(szSQL), vActiveConnection, adOpenKeyset, adLockReadOnly, adOptionUnspecified) ; return (SUCCEEDED(hr)) ; } catch (_com_error &e) { SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ; } catch (...) { SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ; } return FALSE ; }
//关闭记录集 BOOL CDBRecordSet::Close(void) { try { if (!m_pRecordSetImpl->isValid()) { SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ; return FALSE ; }
HRESULT hr = S_OK ; if(DBRECORDSETPtr->GetState() == adStateOpen) { hr = DBRECORDSETPtr->Close() ; } return (SUCCEEDED(hr)) ; } catch (_com_error &e) { SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ; } catch (...) { SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ; } return FALSE ; }
BOOL CDBRecordSet::IsOpened() { try { if (!m_pRecordSetImpl->isValid()) { SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ; return FALSE ; }
if(DBRECORDSETPtr->GetState() == adStateOpen) { return TRUE ; } } catch (_com_error &e) {   [1] [2] [3] 下一页 [VB.NET程序]ADO 在informix的 Addnew [VB.NET程序]ADO 的测试 [VB.NET程序]ADO 揭密 1 [Web开发][ADO]如何修改ADO的线程模型 [Web开发]Delphi7下仿Ado.Net类的实现 [Web开发]通过COM使用ADO [Web开发]ADO & ADO.NET中使用存储过程的两个共用的函数 [Web开发]Binding a DataGrid to an ADO Recordset [Web开发]ADOCE for ADO Programmers [Web开发]Delphi多线程下的ADO编程
|