/*******************************************************************************
文件名称 : Ado.h 头文件 作 者 : 杨治忠 创建时间 : 2011-1-21 9:25:22 文件描述 : 简单的ADO操作Access2003和Access2007的封装类 版权声明 : 对其他类型数据库的链接暂时没加 QQ:940446982 修改历史 : 杨治忠 2011-1-21 1.00 初始版本 *******************************************************************************/ //注:构造函数已经将智能指针初始化,并在析构函数注销,要用到智能指针操作数据库时,只能用对应的对象调用类的智能指针 #pragma once #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") class CAdo { public: CAdo(void); public: ~CAdo(void); public: //连接指针 _ConnectionPtr m_pConnection; //命令执行指针
_CommandPtr m_pCommand; //结果集指针
_RecordsetPtr m_pRecordset; public: //链接数据库 void LinkDatabase(CString str_dbmsname,CString str_dbmstype); //打开数据库表 void OpenTheTable(CString str_tablename); //关闭表 void ClossTheTable(); }; /*******************************************************************************
文件名称 : Ado.cpp 实现文件 作 者 : 杨治忠 创建时间 : 2011-1-21 9:22:41 文件描述 : 简单的ADO操作Access2003和Access2007的封装类 版权声明 : 对其他类型数据库的链接暂时没加 QQ:940446982 修改历史 : 杨治忠 2011-1-21 1.00 初始版本 *******************************************************************************/ #include "StdAfx.h" #include "Ado.h" /******************************************************************** 函数名称 : CAdo(void) 函数描述 : 构造函数 输入参数 : void 备注 : 自动创建智能指针对象 *********************************************************************/ CAdo::CAdo(void) { //OLE/COM初始化 if(!AfxOleInit()) { AfxMessageBox(_T("OLE/COM初始化错误")); } //创建智能指针对象 m_pConnection.CreateInstance(__uuidof(Connection)); m_pRecordset.CreateInstance(__uuidof(Recordset)); m_pCommand.CreateInstance(__uuidof(Command)); } /******************************************************************** 函数名称 : ~CAdo(void) 函数描述 : 析构函数 输入参数 : void 备注 : 自动关闭记录集和链接并销毁智能指针 *********************************************************************/ CAdo::~CAdo(void) { if(m_pRecordset->State!=adStateClosed) m_pRecordset->Close(); m_pRecordset = NULL; if(m_pCommand->State!=adStateClosed)
m_pCommand->Release(); m_pCommand = NULL; if(m_pConnection->State!=adStateClosed)
m_pConnection->Close(); m_pConnection = NULL; } /******************************************************************** 函数名称 : LinkDatabase() 函数描述 : 链接数据库 输入参数 : 数据库名字 str_dbmsname;数据库的类型和版本 str_dbmstype str_dbmstype可以是Access2007,Access2003; 备注 : *********************************************************************/ void CAdo::LinkDatabase(CString str_dbmsname,CString str_dbmstype) { // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息, // 因为它有时会经常出现一些想不到的错误。 try { CString str_conn; if (str_dbmstype==_T("Access2007")) { str_conn.Format(_T("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s.accdb"),str_dbmsname); } if (str_dbmstype==_T("Access2003")) { str_conn.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s.mdb"),str_dbmsname); } // 打开本地Access库 m_pConnection->Open((_bstr_t)str_conn,"","",adModeUnknown); }
catch(_com_error e) { AfxMessageBox(_T("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!")); } } /******************************************************************** 函数名称 : OpenTheTable() 函数描述 : 打开数据库的表(打开记录集) 输入参数 : 表的名字 str_tablename 备注 : 再次打开任何表时记得先关闭多次打开会出错 *********************************************************************/ void CAdo::OpenTheTable(CString str_tablename) { // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息, // 因为它有时会经常出现一些想不到的错误。 try { CString str_conn; str_conn.Format(_T("SELECT * FROM %s"),str_tablename); m_pRecordset->Open((_bstr_t)str_conn, // 查询DemoTable表中所有字段 m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针 adOpenDynamic, adLockOptimistic, adCmdText); } catch(_com_error *e) { AfxMessageBox(e->ErrorMessage()); } } /******************************************************************** 函数名称 : ClossTheTable() 函数描述 : 关闭表(关闭记录集集) 输入参数 : void 备注 : 虽然析构函数有自动关闭,但打开与关闭必须配对,这里只是关闭, 不能让m_pRecordset=NULL,销毁指针由析构函数负责 *********************************************************************/ void CAdo::ClossTheTable() { if(m_pRecordset->State != adStateClosed) m_pRecordset->Close(); }
|
|