首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
iiprogram (69)
qdzx2008 (50)
goodboy1881 (14)
wangchinaking (58)
fancyhf (1)
harrymeng (41)
yjz0065 (113)
coofucoo (105)
Drate (69)
lphpc (30)
CSDN - 文档中心 - Visual C++ 阅读:3546   评论: 0    参与评论
标题   ADO 方法访问数据库的封装接口(01)     选择自 sunnysnows 的 Blog
关键字   ADO 方法访问数据库的封装接口(01)
出处  

        数据库访问是软件开发过程中经常用到的,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


相关文章
对该文的评论