转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 站长学院 >> Web开发 >> 正文
ADO 方法访问数据库的封装接口(04)         ★★★★

ADO 方法访问数据库的封装接口(04)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1643 更新时间:2009/4/23 10:43:56

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编程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Web开发  · 网页制作
    · 平面设计  · 网站运营
    · 网站推广  · 搜索优化
    · 建站心得  · 站长故事
    · 互联动态
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台