欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

MFC用ADO连接数据库(ACCESS)

程序员文章站 2022-06-02 23:36:57
...

Microsoft ActiveX Data Objects (ADO) 支持用于建立基于客户端/服务器和 Web 的应用程序的主要功能。其主要优点是易于使用、高速度、低内存支出和占用磁盘空间较少。本次封装的CadoInterface类仅针对MFC的使用,目的是优化对ADO的操作,避免频繁写try catch

Microsoft ActiveX Data Objects (ADO) 支持用于建立基于客户端/服务器和 Web 的应用程序的主要功能。其主要优点是易于使用、高速度、低内存支出和占用磁盘空间较少。 本次封装的CadoInterface类仅针对MFC的使用,目的是优化对ADO的操作,避免频繁写try catch(…)以及在连库、开表、写数据、读数据等过程中一些重复性的工作。该类仅对一些常用的操作进行封装,用户可以根据需要进行修改和扩展。

封装类主要包括:基本操作、增值操作、支持算法与支持结构。基本操作、增值操作、支持算法在CDataBase.h与CDataBase.cpp中声明定义。

1.用#import指令引入ADO类型库

为了引入ADO类型库,需要在项目的stdafx.h文件中加入如下语句: #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")注意添加的位置在#endif //_AFX_NO_AFXCMN_SUPPORT之后

2.将封装类加到工程中

CDataBase.h代码如下:

class CDataSource  
{
public:
	//当前记录指针是否到了所有记录之后
	BOOL IsEOF();
	//当前记录指针是否到了所有记录之前
	BOOL IsBOF();
	//删除当前记录
	void Delete();
	//设置FieldName字段的值为Value(int型)
	void SetAsInteger(CString FieldName, int Value);
	//设置FieldName字段的值为Value(CString型)
	void SetAsString(CString FieldName, CString Value);
	//将记录的修改更新到数据库中
	void Update();
	//新增一条记录
	void New();
	//得到FieldName字段的值(int型)
	int GetAsInteger(CString FieldName);
	//得到FieldName字段的值(CString型)
	CString GetAsString(CString FieldName);
	//当前记录指针是否到了最后一条记录
	BOOL IsLast();
	//当前记录指针是否到了第一条记录
	BOOL IsFirst();
	//移动当前记录指针到下一条记录
	void MoveNext();
	//移动当前记录指针到上一条记录
	void MovePrev();
	//移动当前记录指针到最后一条记录
	void MoveLast();
	//移动当前记录指针到第一条记录
	void MoveFirst();
	//初始化数据
	void InitData();
	CDataSource();
	virtual ~CDataSource();
private:
	int m_MaxID;
	_RecordsetPtr m_pRecordset;
	_ConnectionPtr m_pConn;
	//释放数据
	void FreeData();
};

3.CDataBase.cpp如下:

#include "DataSource.h"
CDataSource::CDataSource()
{
}
CDataSource::~CDataSource()
{
	FreeData();
}
void CDataSource::InitData()
{
	//初始化Com对象,为使用ADO做准备
	CoInitialize(NULL);
	//初始化连接对象
	m_pConn.CreateInstance("ADODB.Connection");
	//初始化记录集对象
	m_pRecordset.CreateInstance("ADODB.Recordset");
	try
	{
		//打开数据库连接
		m_pConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\Data\\Demo.mdb;Persist Security Info=False", "", "", adConnectUnspecified);
		
		//初始化m_MaxID
		m_pRecordset->Open("Select Max(ID) as MAXID From Profile", _variant_t(m_pConn, true), adOpenStatic, adLockOptimistic, adCmdText);		
		m_MaxID = GetAsInteger("MAXID");
		m_pRecordset->Close();
		//打开指定记录集
		m_pRecordset->Open("Select * From Profile", _variant_t(m_pConn, true), adOpenStatic, adLockOptimistic, adCmdText);
	}
	catch(_com_error &e)
	{
		::AfxMessageBox(e.ErrorMessage());
	}
}
void CDataSource::FreeData()
{
	if (m_pConn)
	{
		m_pConn->Close();
		m_pRecordset.Release();
		m_pConn.Release();
		CoUninitialize();
	}
}
void CDataSource::MoveFirst()
{
	m_pRecordset->MoveFirst();
}
void CDataSource::MoveLast()
{
	m_pRecordset->MoveLast();
}
void CDataSource::MovePrev()
{
	m_pRecordset->MovePrevious();
}
void CDataSource::MoveNext()
{
	m_pRecordset->MoveNext();
}
BOOL CDataSource::IsFirst()
{
	if (m_pRecordset->BOF)
	{
		return TRUE;
	}
	else
	{
		m_pRecordset->MovePrevious();
		BOOL Result = m_pRecordset->BOF;
		m_pRecordset->MoveNext();
		return Result;
	}
}
BOOL CDataSource::IsLast()
{
	if (m_pRecordset->EndOfFile)
	{
		return TRUE;
	}
	else
	{
		m_pRecordset->MoveNext();
		BOOL Result = m_pRecordset->EndOfFile;
		m_pRecordset->MovePrevious();
		return Result;
	}
}
CString CDataSource::GetAsString(CString FieldName)
{
	//如果在第一条记录之前或者最后一条记录之后,返回空
	if (IsBOF() || IsEOF())
		return "";
	
	LPTSTR lpFieldName = FieldName.GetBuffer(FieldName.GetLength());
	
	//得到当前记录指定列的值
	_variant_t vValue = m_pRecordset->Fields->Item[lpFieldName]->Value;
	//如果为空值则返回空
	if ((V_VT(&vValue) == VT_NULL) || (V_VT(&vValue) == VT_EMPTY))
	{
		return "";
	}
	//否则以字符串形式返回vValue的值
	else
	{
		CString strResult;
		LPTSTR lpResult = strResult.GetBuffer(strlen(_bstr_t(vValue)));
		strcpy(lpResult, _bstr_t(vValue));
		strResult.ReleaseBuffer();
		return strResult;
	}
}
int CDataSource::GetAsInteger(CString FieldName)
{
	//如果在第一条记录之前或者最后一条记录之后,返回0
	if (IsBOF() || IsEOF())
		return 0;
	LPTSTR lpFieldName = FieldName.GetBuffer(FieldName.GetLength());
	
	//得到当前记录指定列的值
	_variant_t vValue = m_pRecordset->Fields->Item[lpFieldName]->Value;
	
	//如果为空值则返回空
	if (V_VT(&vValue) == VT_NULL)
	{
		return 0;
	}
	//否则以int形式返回vValue的值
	else
	{
		return atoi(_bstr_t(vValue));
	}
}
void CDataSource::New()
{
	//添加一条新的记录
	m_pRecordset->AddNew();
	//设置初始值
	m_MaxID++;
	SetAsInteger("ID", m_MaxID);
	SetAsString("NAME", "无名氏");
	SetAsInteger("GENDER", 0);
	SetAsInteger("AGE", 24);
	SetAsString("NATIONALITY", "汉");
	SetAsString("ADDRESS", "");
	SetAsString("POSTCODE", "");
	SetAsString("NOTE", "");
	
	//更新
	m_pRecordset->Update();
}
void CDataSource::Update()
{
	m_pRecordset->Update();
}
void CDataSource::SetAsString(CString FieldName, CString Value)
{
	//将列名(FieldName)由CString转为LPTSTR型
	LPTSTR lpFieldName = FieldName.GetBuffer(FieldName.GetLength());
	
	//将Value由CString转为LPTSTR型
	LPTSTR lpValue = Value.GetBuffer(Value.GetLength());
	
	//将Value值更新到Recordset中
	m_pRecordset->Fields->Item[lpFieldName]->Value = lpValue;
	//释放缓冲区
	FieldName.ReleaseBuffer();	
	Value.ReleaseBuffer();	
}
void CDataSource::SetAsInteger(CString FieldName, int Value)
{
	CString cs;
	
	//将Value由int型转为CString型
	cs.Format("%d", Value);
	//使用SetAsString设置指定列的值
	SetAsString(FieldName, cs);
}
void CDataSource::Delete()
{
	//删除当前记录
	m_pRecordset->Delete(adAffectCurrent);	
}
BOOL CDataSource::IsBOF()
{
	return m_pRecordset->BOF;
}
BOOL CDataSource::IsEOF()
{
	return m_pRecordset->EndOfFile;
}






代码链接:点击打开链接

添加操作:new()->m_ds.SetAsString("NAME");->m_ds.Update();

删除操作:m_ds.delete()->m_ds.Update();(删除m_ds指向的记录集)