MFC连接ACCESS数据库心得

由于写个小程序,自己封装了一下,做了一个辅助类。和大家分享一下~

DataBaseHelper.h

#pragma once
#include <map>
#include <list>
#include "ValueObject.h"
using namespace std;
#import "C:\Program Files\Common Files\System\ADO\msado15.dll"  rename("EOF","adoEOF"), rename("BOF","adoBOF") 
using namespace ADODB;
typedef list<ValueObject*> VALUEOBJECT_LIST;
typedef list<CString> CSTRING_LIST;

class DataBaseHelper
{
public:
	virtual ~DataBaseHelper();
	static DataBaseHelper* GetInstance();
	static CString formatToSql(CString sql);
	static int CStringParseInt(CString numStr);
	static void ReleaseValueObjectList(VALUEOBJECT_LIST list);
	static void ReleaseCStringList(CSTRING_LIST list);
	ValueObject* findBySql(ValueObject* vo,CString sql);
	VALUEOBJECT_LIST findListBySql(ValueObject* vo,CString sql);
	BOOL updateBySql(CString sql);
	BOOL deleteBySql(CString sql);
	BOOL insertBySql(CString sql);
	BOOL initADOConn();
	BOOL excuteSQL(CString sql);
	void unInitADOConn();
private:
	DataBaseHelper();
	_ConnectionPtr  pConnection; 
	_RecordsetPtr   pRecordset;
	_CommandPtr     pCommand;
	HRESULT hr;
	BOOL bSuccess;
	void printError(CString msg);
	void printLog(CString msg);
};
DataBaseHelper.cpp

#include "StdAfx.h"
#include "DataBaseHelper.h"

DataBaseHelper::DataBaseHelper()
{
	pConnection = NULL;
	pRecordset = NULL;
	pCommand = NULL;
}
DataBaseHelper::~DataBaseHelper()
{
	unInitADOConn();
}
//初始化数据库连接
BOOL DataBaseHelper::initADOConn()
{
	bSuccess = TRUE;
	if(NULL == pConnection)
	{
		::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);    
		//得到当前程序路径
		CString    sPath;   
		GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);   
		sPath.ReleaseBuffer    ();   
		int    nPos;   
		nPos=sPath.ReverseFind('\\');   
		sPath=sPath.Left(nPos);   
		CString conStr_ = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sPath + "\\data\\data.mdb;Jet OLEDB:Database Password=zch";
		_bstr_t conStr = conStr_;
		try
		{
			hr = pConnection.CreateInstance(__uuidof(Connection));///创建Connection实例
			if(SUCCEEDED(hr))
			{
				hr = pConnection->Open(conStr,"","",adModeUnknown);
			}
			else
			{
				bSuccess = FALSE;
			}
		}
		catch(_com_error e)
		{
			//连接失败
			bSuccess = FALSE;
			CString errormessage;
			errormessage.Format(e.Description());
			printError(errormessage);
		}
	}
	return bSuccess;
}
//反初始化数据库连接
void DataBaseHelper::unInitADOConn()
{
	if(pRecordset!=NULL)
		pRecordset->Close();
	if(pConnection!=NULL)
		pConnection->Close();
	::CoUninitialize();
}
//单例模式,获取实例
DataBaseHelper* DataBaseHelper::GetInstance()
{
	static DataBaseHelper* dbHelper = NULL;

	if(!dbHelper)
	{
		dbHelper = new DataBaseHelper();
	}
	return dbHelper;

}
//根据主键查询 返回vo
ValueObject* DataBaseHelper::findBySql(ValueObject* vo,CString sql)
{
	try
	{
		hr = pRecordset.CreateInstance(__uuidof(ADODB::Recordset));
		if(SUCCEEDED(hr)){
			excuteSQL(sql);
			_variant_t roader;
			STRING_MAP fields = vo->getFields();
			if(!pRecordset->adoEOF)
			for(STRING_MAP::iterator it = fields.begin(); it != fields.end(); it++)
			{
				roader = pRecordset->GetCollect(it->first.GetString());
				if(roader.vt != VT_NULL)
				{
					vo->setCString(it->first,roader);
				}
			}
		}
	}
	catch(_com_error e)
	{
		//连接失败
		CString errormessage;
		errormessage.Format(e.Description());
		printError(errormessage);
	}
	return vo;
}
//根据sql查询list
VALUEOBJECT_LIST DataBaseHelper::findListBySql(ValueObject* vo,CString sql)
{
	VALUEOBJECT_LIST list;
	try
	{
		hr = pRecordset.CreateInstance(__uuidof(ADODB::Recordset));
		if(SUCCEEDED(hr)){
			excuteSQL(sql);
			_variant_t roader;
			STRING_MAP fields = vo->getFields();
			while(!pRecordset->adoEOF)
			{
				ValueObject* temVo = new ValueObject(vo->getModelName());
				for(STRING_MAP::iterator it = fields.begin(); it != fields.end(); it++)
				{
					roader = pRecordset->GetCollect(it->first.GetString());
					if(roader.vt != VT_NULL)
					{
						temVo->setCString(it->first,roader);
					}
				}
				list.push_back(temVo);
				pRecordset->MoveNext();
			}
		}
	}
	catch(_com_error e)
	{
		//连接失败
		CString errormessage;
		errormessage.Format(e.Description());
		printError(errormessage);
	}
	return list;
}

BOOL DataBaseHelper::excuteSQL(CString sql)
{
	BOOL bFlag = TRUE;
	if(bSuccess)
	{
		_bstr_t sqlToExecute = sql;
		printLog(L"SQL:"+sql);
		try
		{
			pRecordset = pConnection->Execute(sqlToExecute,NULL,adCmdText);
			bFlag = TRUE;
		}
		catch(_com_error e)
		{
			//连接失败
			bFlag = FALSE;
			CString errormessage;
			errormessage.Format(e.Description());
			printError(errormessage);
		}
	}
	return bFlag;
}

//文本格式转换。
//单引号
CString DataBaseHelper::formatToSql(CString sql)
{
	sql.Replace(L"'",L"''");
	return sql;
}
//String转int
int DataBaseHelper::CStringParseInt(CString numStr)
{
	char *ch = (char*)numStr.GetBuffer(numStr.GetLength());
	int num = atoi(ch);
	numStr.ReleaseBuffer();
	return num;
}
//释放list的资源
void DataBaseHelper::ReleaseValueObjectList(VALUEOBJECT_LIST list)
{
	while (!list.empty())
	{
		ValueObject* p =list.front();
		delete p;
		list.pop_front();

	}
}
//释放list的资源
void DataBaseHelper::ReleaseCStringList(CSTRING_LIST list)
{
	while (!list.empty())
	{
		list.pop_front();

	}
}
void DataBaseHelper::printError(CString msg)
{
	TRACE1("ERROR: %s\n",msg);
}
void DataBaseHelper::printLog(CString msg)
{
	TRACE1("Log: %s\n",msg);
}

这里用到了一个值对象,类似web开发中的DTO

ValueObject.h

#pragma once
#include <map>
using namespace std;
typedef map<CString,CString> STRING_MAP;
class ValueObject
{
public:
	ValueObject(CString modelName);
	virtual ~ValueObject();

	STRING_MAP getFields();
	void setCString(CString field,CString value);
	CString getCString(CString field);
	CString getModelName();
private:
	STRING_MAP fields;
	CString modelName;
};
ValueObject.cpp

#include "StdAfx.h"
#include "ValueObject.h"

ValueObject::ValueObject(CString modelName)
{
	//以后实现
	this->modelName = modelName;
}

ValueObject::~ValueObject()
{
}

STRING_MAP ValueObject::getFields()
{
	return this->fields;
}
//往map中设置值,如果存在则覆盖field的value,不存在则insert
void ValueObject::setCString(CString field,CString value)
{
	STRING_MAP::iterator it= this->fields.find(field);
	if(it != fields.end()) {
		it->second = value;
	}else
	{
		this->fields.insert(STRING_MAP::value_type(field,value));
	}
	
}
//从map中取出字段的值,如果字段不存在则返回空字符串
CString ValueObject::getCString(CString field)
{
	CString result = L"";
	STRING_MAP::iterator it= this->fields.find(field);
	if(it != fields.end()) {
		result = it->second;
	}
	return result;
}
CString ValueObject::getModelName()
{
	return this->modelName;
}

使用的时候:

insert、update、delete都是用excuteSQL去执行,返回成功与否。

select时有两种用法,一种是根据主键查询,返回一条记录:

BOOL findProjectByID(CString id)
{
	ValueObject* project = new ValueObject(L"PROJECT");
	project->setCString(L"ID",L"");
	project->setCString(L"PNAME",L"");
	project->setCString(L"REMARK",L"");
	CString sql = L"SELECT ID,PNAME,REMARK FROM PROJECT WHERE ID="+id;
	ValueObject* temVo = dbHelper->findBySql(project,sql);
	m_id =temVo->getCString(L"ID");
	m_pname = temVo->getCString(L"PNAME");
	m_remark = temVo->getCString(L"REMARK");
	UpdateData(FALSE);
	delete project;
	return TRUE;
}

第二种是,查询返回N条记录:

void loadPlan(CString id)
{
	ValueObject *vo = new ValueObject(L"PLAN");
	vo->setCString(L"ID",L"");
	vo->setCString(L"PNAME",L"");
	VALUEOBJECT_LIST list = dbHelper->findListBySql(vo,L"SELECT ID,PNAME FROM PLAN WHERE PROJECT_ID="+id);
	//遍历list取数据
	for(VALUEOBJECT_LIST::iterator plist = list.begin(); plist != list.end(); plist++)
	{
		ValueObject* temVo = *plist;
		CString str = temVo->getCString(L"ID");
		
	}
	DataBaseHelper::ReleaseValueObjectList(list);
	delete vo;
}
写的粗糙,请见谅,但解决了一些问题,用起来也比直接用ADO方便一些。有问题可以联系我和我交流~




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值