内容发布更新时间 : 2025/1/11 14:55:26星期一 下面是文章的全部内容请认真阅读。
VC++下使用ADO访问Access数据库完整篇
2009年10月18 | 分类: 编程开发 | 3 条评论 | 标签: Visual Studio 这次先整理一下ADO的全套流程方便有类似需求的网友参考。实际上,根据天缘的经验,接口类编程只需要遵守人家的约定就可以了,很多做软件的网友也都是忙的很,没有时间一一深究。
1、在StdAfx.h中引入ADO类支持
方法是在StdAfx.h中增加下面两句话: #include
#import \no_namespace rename (\
2、初始化COM环境
在MFC中可以用AfxOleInit()或CoInitialize(NULL),该函数一般放在InitInstance()历程里。
非MFC使用用CoInitialize(NULL)。
卸载COM环境使用CoUnInitialize(),一般放在主程序的析构函数里。 这样我们就会三个指针可用:_ConnectionPtr、_RecordsetPtr和_CommandPtr,分别代表:
_ConnectionPtr接口返回一个记录集或一个空指针,通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,对于要返回记 录的操作通常使用_RecordserPtr来实现。而用 _ConnectionPtr操作时要想得到记录条数得遍历所有记录,用_RecordserPtr则不需要。
_RecordsetPtr指针是一个记录集对象。可以对记录集提供了更多的控制功能。它不一定要使用一个已经创建的数据连接,可以用一个连接串代 替连接指针赋给 _RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是使用已经创建了数据库连接的全 局
_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。 _CommandPtr指针接口返回一个记录集。CommandPtr提供了一种简单方法来执行返回记录集的存储过程和SQL语句。可以利用全局 _ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。一次或少量数据库访问操作,一般是
直接使用连接串,如果需要频 繁访问数据库,涉及返回多个记录集,那么,建议同_RecordsetPtr用法一样,使用全局数据库连接后,再使用_CommandPtr 接口执行存储过程和SQL语句。 各指针的定义方法:
_ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset; _CommandPtr m_pCommand;
3、连接、关闭数据库
1、连接数据库
示例连接ACCESS,以昨天的FavorMan为例。
::CoInitialize(NULL);//数据库操作前先初始化COM环境
CString strSQL; //配置初始连接串
strSQL=\Source=blogurl.mdb;\
strSQL=strSQL+\Source=blogurl.mdb;\
\为上面读到数据库路径信息! DB_PASSWRD_STRING+\
\注意一定需要输入四个\\\\\\\\才能表示\
//如果单独输入,必须形式为\格式!
//--连接数据库----------------- HRESULT hr; try {
hr = m_pConnection.CreateInstance(\创建Connection对象
if(SUCCEEDED(hr)) {
hr =
m_pConnection->Open((_bstr_t)strSQL,\连接数据库
///上面一句中连接字串中的Provider是针对ACCESS2000环境的,
对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; } } }
catch(_com_error e)///捕捉异常 {
CString errormessage;
errormessage.Format(\连接数据库失败!\\r\\n错误:%s!\
AfxMessageBox(errormessage);///显示错误信息
return FALSE; }
2、关闭数据库
if( m_pConnection->State )//如果连接有效 m_pConnection->Close(); m_pConnection = NULL;
4、数据库访问
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(\try {
//打开数据库
m_pRecordset->Open(\ m_pConnection.GetInterfacePtr(),//或使用
_variant_t((IDispatch*)theApp.m_pConnection,true),,但需要extern声明theApp;
adOpenDynamic, adLockOptimistic, adCmdText); //遍历读取
while(!m_pRecordset->adoEOF)//adoEOF判断数据库指针是否已经到结果集末尾;BOF判断是否在第一条记录前面 {