/*******************************************************************************
文件名称 : 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();
}