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

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

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

        数据库访问是软件开发过程中经常用到的,ADO方法访问数据库是现在Windows平台开发软件经常用到的方法,但是在ADO组件中,使用COM调用的时候,经常会出现各种异常,异常处理在开发过程中如果处理不当,经常会导致程序无法正常工作甚至崩溃。本人在开发软件过程中,对ADO方法进行了封装,把COM异常吸收在类的内部,这样引用的时候就不必考虑异常处理,使开发过程简单化。本次封装,没有支持全部的方法,只是把最基本的数据库访问方法进行了封装,能够满足一般的开发应用。使用封装类的一个好处是,如果系统需要扩展数据库,比如支持其他的数据库访问方法,只需要修改实现就可以了,不需要调整接口,也增强了软件的可扩展性。
1. DBConnectionImpl.h
#pragma once

typedef _ConnectionPtr CADOConnectionPtr;

class CDBConnectionImpl
{
 //构造函数和析构函数
public:
 CDBConnectionImpl(void);
 virtual ~CDBConnectionImpl(void);

 //copy 采用复制的方式,复制后两个连接是相同,复制后的任何一个副本关闭连接后,
 //所有副本的连接都会关闭,需要注意
   
 //copy constructor
 CDBConnectionImpl(const CDBConnectionImpl& rConnectionImpl) ;

 //operator =
 CDBConnectionImpl& operator= (const CDBConnectionImpl& rConnectionImpl) ;

 //接口函数
public:

 //返回数据库连接
 CADOConnectionPtr& GetConnection(void);

 /*
  * 判断当前连接是否已经创建对象
  */
 BOOL isValid(void) ;

 void SetErrorMessage(LPCTSTR szErrMsg,const char* szSourceFile=NULL,int nLine=0) ;

 const CString& GetErrorMessage(void) ;

 //是否自动关闭连接
 BOOL GetAutoClose(void) ;

protected:
 //数据库连接
 CADOConnectionPtr m_pConnectionPtr;
 //error message
 CString m_strErrMsg ;
 //是否自动关闭连接
 BOOL m_bAutoClose ;
};

inline CADOConnectionPtr& CDBConnectionImpl::GetConnection(void)
{
 return m_pConnectionPtr ;
};

inline BOOL CDBConnectionImpl::isValid(void)
{
 return (m_pConnectionPtr != NULL) ;
};

inline const CString& CDBConnectionImpl::GetErrorMessage(void)
{
 return m_strErrMsg;
}

inline BOOL CDBConnectionImpl::GetAutoClose(void)
{
 return m_bAutoClose ;
}

2. DBConnectionImpl.cpp
#include "StdAfx.h"
#include ".\dbconnectionimpl.h"
#include "DBErrorMsgDefs.h"
#include "ErrorHandler\Win32ErrorMsg.h"

CDBConnectionImpl::CDBConnectionImpl(void):
 m_bAutoClose(TRUE)
{
 HRESULT hr = S_OK ;
 try
 {
  hr = m_pConnectionPtr.CreateInstance(__uuidof(Connection));
  if (FAILED(hr))
  {
   CString strErrMsg = CWin32ErrorMsg::GetHResultErrorDescription(hr) ;
   SetErrorMessage((LPCTSTR)strErrMsg,__FILE__,__LINE__) ;
  }
 }
 catch (_com_error &e)
 {
  SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;
 }
 catch (...)
 {
  SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;
 }
}

//copy constructor
CDBConnectionImpl::CDBConnectionImpl(const CDBConnectionImpl& rConnectionImpl):
 m_pConnectionPtr(NULL),
 m_bAutoClose(FALSE)
{
 
 *this = rConnectionImpl ;
}

//operator =
CDBConnectionImpl& CDBConnectionImpl::operator= (const CDBConnectionImpl& rConnectionImpl)
{
 if(this == &rConnectionImpl)
 {
  return *this ;
 }

 //错误信息不复制 
 try
 {  
  m_strErrMsg = _T("");
  //关闭连接,并释放对象
  if (m_pConnectionPtr != NULL)
  {
   if((m_pConnectionPtr->GetState() != adStateClosed) && (m_bAutoClose) )
   {
    m_pConnectionPtr->Close() ;
    m_pConnectionPtr = NULL ;
   }  
  }

  //clone it from destination
  if(rConnectionImpl.m_pConnectionPtr != NULL)
  {
   m_pConnectionPtr = rConnectionImpl.m_pConnectionPtr ;
  } 
  m_bAutoClose = FALSE ;
 }
 catch (_com_error &e)
 {
  SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;
 }
 catch (...)
 {
  SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;
 }
 return *this ;
}

CDBConnectionImpl::~CDBConnectionImpl(void)
{
 try
 {
  //关闭连接,并释放对象
  if (m_pConnectionPtr != NULL)
  {
   if( (m_pConnectionPtr->GetState() != adStateClosed) && (m_bAutoClose) )
   {
    m_pConnectionPtr->Close() ;
   }
   m_pConnectionPtr = NULL ;
  }
 }
 catch (_com_error &e)
 {
  SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;
 }
 catch (...)
 {
  SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;
 }
}

void CDBConnectionImpl::SetErrorMessage(LPCTSTR szErrMsg,const char* szSourceFile,int nLine)
{
 m_strErrMsg = szErrMsg ;
}

//end of this file DBConnectionImpl.cpp


[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……
    咸宁网络警察报警平台