VC++ ADO操作数据库

头文件声明(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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值