VC++下使用ADO访问Access数据库完整篇 下载本文

内容发布更新时间 : 2024/5/18 21:18:23星期一 下面是文章的全部内容请认真阅读。

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判断是否在第一条记录前面 {