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

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

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

3. DBConnection.h
#pragma once

#include <comutil.h>
#pragma comment(lib,"comsupp.lib")

class CDBConnectionImpl ;
class CDBRecordSet ;

class AFX_EXT_CLASS CDBConnection
{
 friend class CDBRecordSet ;

public:
 CDBConnection(void);
 virtual ~CDBConnection(void);
 
 /*
  * 设置数据库连接参数
  *  参数:
  *  [in] szServerName -> 数据库所在机器的机器名或者IP地址
  *  [in] szBaseName  -> 数据库实例名称
  *  [in] szUser   -> 数据库登陆用户名
  *  [in] szPasswd  -> 登陆密码
  */
 void SetParameters(LPCTSTR szServerName,LPCTSTR szBaseName,LPCTSTR szUser,LPCTSTR szPasswd) ;

 //是否连接已经打开
 BOOL IsOpened(void) ;

 //打开连接
 BOOL Open(void) ;

 //开始事务
 BOOL BeginTrans(void) ;

 //提交事务
 BOOL CommitTrans(void) ;

 //回滚事务
 BOOL RollbackTrans(void) ;

 /*
  * 执行SQL语句,例如 insert , update 等,不返回记录
  * 参数:
  *  [in] szSQL  -> SQL语句
  *  [out] pnRecordsAffected -> the number of records that the operation affected.
  */
 BOOL Execute(LPCTSTR szSQL,int* pnRecordsAffected = NULL) ;

 /*
  * 执行SQL语句,并返回记录集
  * 参数:
  *  [in] szSQL  -> SQL语句, select ......
  *  [out] recordSet -> 本次查询得到的记录集
  */
 BOOL OpenRecordSet(LPCTSTR szSQL,CDBRecordSet& rRecordSet) ;

 //关闭连接
 BOOL Close(void) ;

 /*
  * 设置错误信息
  *  参数:
  *  [in] szErrMsg  -> 错误信息
  *  [in] szSourceFile -> 发生错误的源文件
  *  [in] nLine   -> 发生错误的行号
  */
 void SetErrorMessage(LPCTSTR szErrMsg,const char* szSourceFile=NULL,int nLine=0);

 //获取错误信息
 LPCTSTR GetErrorMessage(void) const;

 //获取数据库访问的错误信息
 LPCTSTR GetDBConnectionErrorMsg(void) ;
 
public:

 //clone 方法,clone后两个对象具有相同的数据库连接参数,但是各自占有独立的数据库连接,
 //clone 以后,各自有独立的操作,不会相互影响

 BOOL CloneTo(CDBConnection& toConnection) ;


 //copy 后,两个对象使用共同的连接,实际只使用用一个相同的数据库连接
 //对数据库连接的操作会相互影响,需要注意。
 //源的close/open会关闭所有副本的连接,但是副本的close/open不会影响其他连接

 //copy 构造函数
 CDBConnection(const CDBConnection& rConnection) ;

 //赋值运算符
 CDBConnection& operator= (const CDBConnection& rConnection);

protected:

 //生成数据库连接字符串
 void FormatDataSource(void) ;

 //获取数据库连接接口
 BOOL GetConnectionIDispatch(_variant_t& vActiveConnection) ;

protected:

 //数据库连接
 CDBConnectionImpl* m_pConnImpl ;

 //数据库所在机器的机器名或者IP地址
 CString m_strServerName ;

 //数据库实例名称
 CString m_strBaseName ;
 
 //数据库登陆用户名
 CString m_strDBUser ;

 //登陆密码
 CString m_strPasswd ;

 //数据库连接字符串
 CString m_strDataSource ;

 //数据库连接错误
 CString m_strConnErrorMsg ;

};
4. DBConnection.cpp
#include "StdAfx.h"
#include ".\dbconnection.h"
#include "DBConnectionImpl.h"
#include "DBErrorMsgDefs.h"
#include "DBRecordSet.h"

//ADO _ConnectionPtr
#define  DBCONNECTIONPtr m_pConnImpl->GetConnection()

CDBConnection::CDBConnection(void) 
{
 m_pConnImpl = new CDBConnectionImpl() ; 
}

CDBConnection::~CDBConnection(void)
{
 if (m_pConnImpl != NULL)
 {
  delete m_pConnImpl ;
  m_pConnImpl = NULL ;
 }
}

//copy 构造函数
CDBConnection::CDBConnection(const CDBConnection& rConnection):
 m_pConnImpl(NULL)
{
 //调用默认构造函数
 *this = rConnection ;
}

//赋值运算符
CDBConnection& CDBConnection::operator= (const CDBConnection& rConnection)
{
 if(this == &rConnection)
 {
  return *this ;
 }
 m_strServerName = rConnection.m_strServerName ;
 m_strBaseName = rConnection.m_strBaseName ;
 m_strDBUser = rConnection.m_strDBUser ;
 m_strPasswd = rConnection.m_strPasswd ;
 m_strDataSource = rConnection.m_strDataSource ;

 if(rConnection.m_pConnImpl == NULL)
 {
  if(m_pConnImpl != NULL)
  {
   delete m_pConnImpl ;
   m_pConnImpl = NULL ;
  }
 }
 else
 {
  if(m_pConnImpl == NULL)
  {
   m_pConnImpl = new CDBConnectionImpl() ;
  }
  *m_pConnImpl = *rConnection.m_pConnImpl ; //copy it
 }
 return *this ;
}

void CDBConnection::SetParameters(LPCTSTR szServerName,LPCTSTR szBaseName,LPCTSTR szUser,LPCTSTR szPasswd)
{
 m_strServerName = _T("") ;
 m_strBaseName = _T("");
 m_strDBUser = _T("");
 m_strPasswd = _T("") ;
 if(szServerName)
 {
  m_strServerName = szServerName ;
 }

 if (szBaseName)
 {
  m_strBaseName = szBaseName ;
 }

 if(szUser)
 {
  m_strDBUser = szUser ;
 }

 if(szPasswd)
 {
  m_strPasswd = szPasswd ;
 }
 FormatDataSource() ;
}

void CDBConnection::FormatDataSource(void)
{
 m_strDataSource.Format(_T("Provider=''''sqloledb'''';Data Source=''''%s'''';Initial Catalog=''''%s'''';User Id=''''%s'''';Password=''''%s'''';"),
       (LPCTSTR)m_strServerName,
       (LPCTSTR)m_strBaseName,
       (LPCTSTR)m_strDBUser,
       (LPCTSTR)m_strPasswd
       ) ;
}

//是否连接已经打开
BOOL CDBConnection::IsOpened(void)
{
 if (!m_pConnImpl->isValid())
 {
  SetErrorMessage(CONNCTION_INVALIDHANDLE,__FILE__,__LINE__) ;
  return FALSE ;
 }
 return (DBCONNECTIONPtr->GetState() == adStateOpen);
}

//打开连接
BOOL CDBConnection::Open(void)
{
 try
 {
  if (!m_pConnImpl->isValid())
  {
   SetErrorMessage(CONNCTION_INVALIDHANDLE,__FILE__,__LINE__) ;
   return FALSE ;
  }

  if (m_pConnImpl != NULL)
  {
   if(!m_pConnImpl->GetAutoClose())
   {
    //删除从其他对象复制的连接,防止连接冲突
    delete m_pConnImpl ;
    m_pConnImpl = new CDBConnectionImpl() ;
   }
  }

  //check if is already opened
  if(DBCONNECTIONPtr->GetState() != adStateClosed)
  {
   //if is opened,close it first
   DBCONNECTIONPtr->Close() ;
  }

  DBCONNECTIONPtr->Errors->Clear();
  DBCONNECTIONPtr->CursorLocation = adUseClient;
  DBCONNECTIONPtr->Open(_bstr_t((LPCTSTR)m_strDataSource),_bstr_t(_T("")),_bstr_t(_T("")),adConnectUnspecified);
  return (DBCONNECTIONPtr->GetState() == adStateOpen);
 }
 catch (_com_error &e)
 {
  SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;
 }
 catch (...)
 {
  SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;
 }
 return FALSE ;
}

//关闭连接
BOOL CDBConnection::Close(void)
{
 try
 {
  if (!m_pConnImpl->isValid())
  {
   SetErrorMessage(CONNCTION_INVALIDHANDLE,__FILE__,__LINE__) ;
   return FALSE ;
  }

  if (m_pConnImpl != NULL)
  {
   if(!m_pConnImpl->GetAutoClose())
   {
    //删除从其他对象复制的连接,防止连接冲突
    delete m_pConnImpl ;
    m_pConnImpl = new CDBConnectionImpl() ;
   }
  }

  HRESULT hr = S_OK ;
  if(DBCONNECTIONPtr->GetState() == adStateOpen)
  {
   hr = DBCONNECTIONPtr->Close() ;
  }
  return (SUCCEEDED(hr)) ;
 }
 catch (_com_error &e)
 {
  SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;
 }
 catch (...)
 {
  SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;
 }
 return FALSE ;
}

//开始事务
BOOL CDBConnection::BeginTrans(void)
{
 try
 {
  if (!m_pConnImpl->isValid())
  {
   SetErrorMessage(CONNCTION_INVALIDHANDLE,__FILE__,__LINE__) ;
   return FALSE ;
  }
  DBCONNECTIONPtr->Errors->Clear();
  if (DBCONNECTIONPtr->GetState() != adStateClosed)
  {
   DBCONNECTIONPtr->BeginTrans() ;
   return TRUE ;
  }  
 }
 catch (_com_error &e)
 {
  SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;
 }

[1] [2]  下一页


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