头文件声明(CAdoDbHandler.h):
#ifndef __CADODBHANDLER_HEADER__
#define __CADODBHANDLER_HEADER__
#pragma once
#include <iostream>
#include <vector>
#import "C:/Program Files/Common Files/System/ado/msadox.dll" //no_namespace //ADOX
#import "C:/Program Files/Common Files/System/ado/msado15.dll" rename("EOF","adoEOF") // no_namespace // 不使用命名空间 ADODB
class CAdoDbHandler
{
// 类成员
protected:
static std::string ACCESS_PROVIDER; // Access数据库驱动程序
static bool s__bInitialized; // COM环境已初始化标志
static std::vector<CAdoDbHandler*> * s_dbHandlers;
// 对象成员
protected:
ADOX::_CatalogPtr m_pCatalog; // 数据库智能指针
ADODB::_ConnectionPtr m_pConnection; // 连接智能指针
ADOX::_TablePtr m_pTable; // 表指针
std::string m_sFullPathName; // 完整路径数据库名
std::string m_sProviderName; // 带驱动程序名的数据库名
// 静态成员函数
public:
// 创建一个CAdoDbHandler对象
static CAdoDbHandler * CreateHandler();
static void FreeHandler(CAdoDbHandler *pHandler);
// 清理CAdoDbHandler对象
static void CleanUp();
// 非静态成员函数
public:
bool CreateDatabase(char* szFullPathName); // 创建数据库
bool ConnectDatabase(char* szFullPathName); // 连接数据库
bool Connect(); // 连接当前数据库
void Disconnect(); // 断开当前数据库的连接
bool ExistTable(char* szTableName); // 判断表是否在当前数据库中存在
int CreateTable(char* szTableName, char* szSQL);// 在当前数据库中创建表
int Execute(char* szSQL); // 执行insert update delete语句
ADODB::_RecordsetPtr Query(char* szSQL); // 执行 select 语句,返回结果集
ADODB::_ConnectionPtr ConnectionPtr();
// 隐藏构造函数
protected:
CAdoDbHandler();
virtual ~CAdoDbHandler();
// 辅助函数
protected:
// 生成带驱动程序的数据库名
static std::string FormatDbNameWithProvider(char* szFullPathName);
};
#endif
源码实现(CAdoDbHandler.cpp):
#include "stdafx.h"
#include "CAdoDbHandler.h"
// Acess数据库驱动程序
std::string CAdoDbHandler::ACCESS_PROVIDER = "Microsoft.Jet.OLEDB.4.0";
// COM环境是否已经初始化
bool CAdoDbHandler::s_bInitialized = false;
// CAdoDbHandler池
std::vector<CAdoDbHandler*> * CAdoDbHandler::s_dbHandlers = new std::vector<CAdoDbHandler*>();
/************************************************************
* 获取一个独立的CAdoDbHandler对象指针
************************************************************/
CAdoDbHandler* CAdoDbHandler::CreateHandler()
{
if (!s_bInitialized)
{
// 初始化 COM 环境
HRESULT hRe = S_OK;
hRe = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (!SUCCEEDED(hRe))
{
std::cout << "初始化COM环境失败" << std::endl;
return NULL;
}
s_bInitialized = true;
CoUninitialize();
std::cout << "初始化COM环境成功" << std::endl;
}
CAdoDbHandler* instance = new CAdoDbHandler();
// 将新对象加入队列中
s_dbHandlers->push_back(instance);
return instance;
}
/************************************************************
* 清理指定定CAdoDbHandler对象
************************************************************/
void CAdoDbHandler::FreeHandler(CAdoDbHandler *pHandler)
{
if (NULL != pHandler && NULL != s_dbHandlers)
{
std::vector<CAdoDbHandler*>::iterator itr = s_dbHandlers->begin();
// 销毁全部CAdoDbHandler对象
while (itr != s_dbHandlers->end())
{
if (*itr == pHandler)
{
s_dbHandlers->erase(itr);
delete pHandler;
pHandler = 0;
break;
}
itr++;
}
}
}
/************************************************************
* 清理所有CAdoDbHandler对象
************************************************************/
void CAdoDbHandler::CleanUp()
{
if (NULL != s_dbHandlers)
{
std::vector<CAdoDbHandler*>::iterator itr = s_dbHandlers->begin();
// 销毁全部CAdoDbHandler对象
while (itr != s_dbHandlers->end())
{
delete *itr;
*itr = 0;
itr++;
}
s_dbHandlers->clear();
}
}
/************************************************************
* 构造函数
************************************************************/
CAdoDbHandler::CAdoDbHandler()
{
//_pRecordset = NULL;
m_pTable = NULL;
m_pConnection = NULL;
m_pCatalog = NULL;
m_sFullPathName = "";
m_sProviderName = "";
}
/************************************************************
* 析构函数
************************************************************/
CAdoDbHandler::~CAdoDbHandler()
{
// 释放智能指针
//_pRecordset = NULL;
m_pTable = NULL;
m_pConnection = NULL;
m_pCatalog = NULL;
//断开连接
Disconnect();
}
/************************************************************
* 创建数据库 (create database .. )
* szFullPathName : 包含路径名的*.mdb文件名
* 返回 : true,创建成功; fasle,失败
************************************************************/
bool CAdoDbHandler::CreateDatabase(char* szFullPathName)
{
// 保存数据库全名 和 带驱动程序名的数据库名
m_sFullPathName = szFullPathName;
m_sProviderName = FormatDbNameWithProvider(szFullPathName);
if (INVALID_FILE_ATTRIBUTES != GetFileAttributes(szFullPathName))
return true;
// 创建数据库
try {
m_pCatalog.CreateInstance(__uuidof (ADOX::Catalog)); // 获取智能指针实例
m_pCatalog->Create(_bstr_t(m_sProviderName.c_str()));
m_pCatalog = NULL; // 释放智能指针
}
catch (_com_error & e)
{
std::cout << "创建数据库失败" << e.ErrorMessage() << std::endl;
return false;
}
std::cout << "创建数据库成功" << std::endl;
return true;
}
/************************************************************
* 连接数据库 (use .. )
* szFullPathName : 包含路径名的*.mdb文件名
* 返回 : true,连接到数据库; fasle,连接失败
************************************************************/
bool CAdoDbHandler::ConnectDatabase(char* szFullPathName)
{
// 保存数据库全名 和 带驱动程序名的数据库名
m_sFullPathName = szFullPathName;
m_sProviderName = FormatDbNameWithProvider(szFullPathName);
// 连接数据库
Connect();
return true;
}
/************************************************************
* 连接当前数据库 (use .. )
* 返回 : true,连接到数据库; fasle,连接失败
************************************************************/
bool CAdoDbHandler::Connect()
{
try {
m_pConnection = NULL;
// 实例智能指针
m_pConnection.CreateInstance(__uuidof(ADODB::Connection));
// 打开连接
m_pConnection->Open(_bstr_t(m_sProviderName.c_str()), "", "", ADODB::adModeUnknown);
}
catch (_com_error & err)
{
std::cout << "连接失败" << err.ErrorMessage() << std::endl;
return false;
}
std::cout << "成功连接到数据库" << std::endl;
return true;
}
/************************************************************
* 断开当前数据库的连接
************************************************************/
void CAdoDbHandler::Disconnect()
{
try
{
if (NULL != m_pConnection && m_pConnection->State)
{
m_pConnection->Close(); // 关闭连接
m_pConnection = NULL; // 释放智能指针
}
else
{
std::cout << "连接已经断开" << std::endl;
return;
}
}
catch (_com_error & err)
{
std::cout << "断开连接异常" << err.ErrorMessage() << std::endl;
}
std::cout << "成功断开连接" << std::endl;
}
/************************************************************
* 判断表是否在当前数据库中存在
************************************************************/
bool CAdoDbHandler::ExistTable(char* szTableName)
{
if (NULL == m_pConnection || !m_pConnection->State)
return false;
m_pTable = NULL;
try {
m_pCatalog.CreateInstance(__uuidof(ADOX::Catalog));
// 激活db连接,相当于SQL语句use [db_name];
m_pCatalog->PutActiveConnection(_bstr_t(m_sProviderName.c_str()));
// 数据库中表总数
int nTableCnt = m_pCatalog->Tables->Count;
// 逐表对照表名
for (int i = 0; i<nTableCnt; i++)
{
m_pTable = (ADOX::_TablePtr)m_pCatalog->Tables->GetItem(long(i));
std::string existTableName = m_pTable->Name;
if (!existTableName.compare(szTableName))
return true;
}
m_pCatalog = NULL;
}
catch (_com_error & err)
{
std::cout << "ExistTable" << err.ErrorMessage() << std::endl;
return false;
}
return false;
}
/************************************************************
* 在当前数据库中创建表 (create table)
* szTableName : 要创建的表名
* szSQL : 创建表的SQL语句
* 返回 : -1,创建出错; 0,表已经存在; >0,创建成功
************************************************************/
int CAdoDbHandler::CreateTable(char* szTableName, char* szSQL)
{
// 检查表是否存在
if (!ExistTable(szTableName))
{
if (Execute(szSQL) >= 0)
return 1; // 成功
else
return -1; // 创建出错
}
return 0; // 表已存在
}
/************************************************************
* 执行不返回记录集的命令 (insert update delete)
* szSQL: 要执行的SQL语句
* 返回: >=0 执行完此SQL语句受影响的记录行数
* < 0 出错
************************************************************/
int CAdoDbHandler::Execute(char* szSQL)
{
_variant_t nRecordsAffected; // 受影响的记录数
try {
m_pConnection->Execute(_bstr_t(szSQL), &nRecordsAffected, ADODB::adModeUnknown);
}
catch (_com_error & err)
{
std::cout << "Execute出错" << err.ErrorMessage() << std::endl;
return -1;
}
std::cout << "Execute成功" << std::endl;
return nRecordsAffected.intVal;
}
/************************************************************
* 执行返回记录集的命令 (select)
* szSQL: 要执行的SQL语句
* 返回: 结果记录集智能指针
************************************************************/
ADODB::_RecordsetPtr CAdoDbHandler::Query(char* szSQL)
{
_variant_t nRecordsAffected;
ADODB::_RecordsetPtr rcdset = NULL;
try {
rcdset.CreateInstance("ADODB.Record"); // 初始化记录集智能指针实例
rcdset = m_pConnection->Execute(_bstr_t(szSQL),
&nRecordsAffected,
ADODB::adCmdText); // 执行select语句
}
catch (_com_error & err)
{
std::cout << "Query失败" << err.ErrorMessage() << std::endl;
return NULL;
}
std::cout << "Query成功" << std::endl;
// 返回结果记录集
return rcdset;
}
/************************************************************
* 生成带驱动程序的数据库名
************************************************************/
std::string CAdoDbHandler::FormatDbNameWithProvider(char* szFullPathName)
{
std::string str = "Provider=";
str.append(ACCESS_PROVIDER);
str.append(";Data Source=");
str.append(szFullPathName);
return str;
}
ADODB::_ConnectionPtr CAdoDbHandler::ConnectionPtr()
{
return m_pConnection;
}