
ado连接access数据库.doc
20页ado 连接 access 数据库 .txt-// 自私,让我们只看见自己却容不下别人如果发短信给你喜 欢的人,他不回,不要再发看着你的相片,我就特冲动的想 P 成黑白挂墙上 !有时,不是世 界太虚伪,只是,我们太天真直接通过 ADO 操作 Access 数据库 作者:徐景周下载示例源码上次经过 < 直接通过 ODBC 读、写 Excel 表格文件 > 和 < 直接通过 DAO 读、写 Access 文件>两篇文章,给大家介绍了 ODBC 和 DAO 两种数据库访问技术的基本使用方法,这次 要给大家介绍的是 ADO 数据库访问技术的使用方法 ADO(Active Data Object ,活动数据对象 )实际上是一种基于 COM( 组件对象模型 )中的自动化接口 (IDispatch) 技术,并以 OLE DB(对象连接和镶入的数据库)为基础,经过OLE DB精心包装后的数据库访问技术,利用它 可以快速的创建数据库应用程序ADO 提供了一组非常简单,将一般通用的数据访问细节进行封装的对象由于 ODBC 数据源也提供了一般的 OLE DB Privider ,所以 ADO 不仅可以应用自身的 OLE DB Privider ,而 且还可以应用所有的 ODBC 驱动程序。
关于 OLE DB 和 ADO 的其它详细情况,读者可以自 行查阅相关书籍或 MSDN ,这里就不一一说明了让我们直接步入主题,如何掌握 ADO 这 种数据库访问技术 ADO 的操作方法和前面讲过的 DAO 的操作在很多方面存在相似之处, 在这里,笔者为了更有效的说明它的使用方法, 用 VC6.0 做了一个示例程序 (AdoRWAccess) ,这个示例程序可以直接通过 ADO 来操作 Access 数据库,示例程序的运行效果如下图所示:在示例程序中我们仍采用原库结构, 数据库名 Demo.mdb ,库内表名 DemoTable , 表内字段名为 Name( 姓名 )和 Age( 年龄 )的两个字段, 来构造示例程序操作所需的 Access 数 据库,这也和上两篇文章的示例源码中的库结构相兼容下面让我们看看 ADO 数据库访问技术使用的基本步骤及方法:首先,要用 #import 语句来引用支持 ADO 的组件类型库 (*.tlb) ,其中类型库可以作 为可执行程序 (DLL 、EXE 等)的一部分被定位在其自身程序中的附属资源里,如:被定位在 msado15.dll 的附属资源中,只需要直接用 #import 引用它既可。
可以直接在 Stdafx.h 文 件中加入下面语句来实现:#import "c:\program files\common files\system\ado\msado15.dll" \no_namespace \rename ("EOF", "adoEOF")其中路径名可以根据自己系统安装的 ADO 支持文件的路径来自行设定当编译器遇到 #import 语句时, 它会为引用组件类型库中的接口生成包装类, #import 语句实际上相当于 执行了 API涵数LoadTypeLib() import 语句会在工程可执行程序输出目录中产生两个文 件,分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指 针,并为各种接口方法、枚举类型, CLSID 等进行声明,创建一系列包装方法语句no_namespace 说明 ADO 对象不使用命名空间, rename ("EOF", "adoEOF") 说明将 ADO 中结束标志 EOF 改为 adoEOF ,以避免和其它库中命名相冲突其次,在程序初始过程中需要初始化组件,一般可以用 CoInitialize(NULL); 来实现, 这种方法在结束时要关闭初始化的 COM ,可以用下面语句 CoUnInitialize(); 来实现。
在 MFC 中还可以采用另一种方法来实现初始化 COM ,这种方法只需要一条语句便可以自动为我们 实现初始化 COM 和结束时关闭 COM 的操作,语句如下所示: AfxOleInit();接着, 就可以直接使用 ADO 的操作了 我们经常使用的只是前面用 #import 语句引用类型库时,生成的包装类 .tlh 中声明的智能指针中的三个,它们分别是 _ConnectionPtr 、_RecordsetPtr 和_Comma ndPtr 下面分别对它们的使用方法进行介绍:1. _ConnectionPtr 智能指针,通常用于打开、关闭一个库连接或用它的 Execute 方法来执行一个不返回结果的命令语句 (用法和 _CommandPtr 中的 Execute 方法类似 )l 打开一个库连接先创建一个实例指针,再用 Open 打开一个库连接,它将返回一个 IUnknown 的自动化接口指针代码如下所示:_ConnectionPtr m_pConnection;// 初始化 COM, 创建 ADO 连接等操作AfxOleInit();m_pConnection.CreateInstance(__uuidof(Connection));// 在 ADO 操作中建议语句中要常用 try...catch() 来捕获错误信息,// 因为它有时会经常出现一些意想不到的错误。
jingzhou xu try// 打开本地 Access 库 Demo.mdbSource=Demo.mdb","","",adModeUnknown);是否在当前路catch(_com_error e)AfxMessageBox(" 数据库连接失败, 确认数据库 Demo.mdb径下 !");return FALSE;l 关闭一个库连接如果连接状态有效,则用 Close 方法关闭它并赋于它空值代码如下所示:if(m_pConnection->State)m_pConnection->Close();m_pConnection= NULL;2. _RecordsetPtr 智能指针,可以用来打开库内数据表,并可以对表内的记录、字 段等进行各种操作l 打开数据表打开库内表名为 DemoTable 的数据表,代码如下:_RecordsetPtr m_pRecordset;m_pRecordset.CreateInstance(__uuidof(Recordset));// 在 ADO 操作中建议语句中要常用 try...catch() 来捕获错误信息, // 因为它有时会经常出现一些意想不到的错误。
jingzhou xu try// 查询{m_pRecordset->Open("SELECT * FROM DemoT able",DemoT able 表中所有字段theApp.m_pConnection.GetInterfacePtr(),// 获取库接库的 IDispatch 指针adOpenDynamic,adLockOptimistic,adCmdText);catch(_com_error *e){AfxMessageBox(e->ErrorMessage());}l 读取表内数据将表内数据全部读出并显示在列表框内, m_AccessList 为列表框 的成 员变量名如 果没有 遇到 表结束标志 adoEOF ,则用 GetCollect( 字 段名)或 m_pRecordset->Fields->GetItem( 字段名 )->Value 方法,来获取当前记录指针所指的字段 值,然后再用 MoveNext() 方法移动到下一条记录位置代码如下所示:_variant_t var;CString strName,strAge;tryif(!m_pRecordset->BOF)m_pRecordset->MoveFirst();elseAfxMessageBox(" 表内数据为空 ");return;// 读入库中各字段并加入列表框中while(!m_pRecordset->adoEOF)var = m_pRecordset->GetCollect("Name");if(var.vt != VT_NULL)strName = (LPCSTR)_bstr_t(var);var = m_pRecordset->GetCollect("Age");if(var.vt != VT_NULL)strAge = (LPCSTR)_bstr_t(var);m_AccessList.AddString( strName + " --> "+strAge );m_pRecordset->MoveNext();// 默认列表指向第一项,同时移动记录指针并显示m_AccessList.SetCurSel(0);catch(_com_error *e)AfxMessageBox(e->ErrorMessage());l 插入 - 记录。
可以先用 AddNew() 方法新增一个空记录,再用 PutCollect( 字段名 ,值 )输入每个字段的值, 最后再 Update() 更新到库中数据既可 其中变量 m_Name 和 m_Age分别为姓名及年龄编辑框的成员变量名代码所下所示:try// 写入各字段值m_pRecordset->AddNew();m_pRecordset->PutCollect("Name", _variant_t(m_Name));m_pRecordset->PutCollect("Age", atol(m_Age));m_pRecordset->Update();AfxMessageBox(" 插入成功 !");catch(_com_error *e){AfxMessageBox(e->ErrorMessage());}l 移动记录指针移动记录指针可以通过 MoveFirst() 方法移动到第一条记录、 MoveLast() 方法移动到最后一条记录、 MovePrevious() 方法移动到当前记录的前一条记录、 MoveNext() 方法移动到当前记录的下一条记录但我们有时经常需要随意移动记录指针到 任意记录位置时,可以使用 Move( 记录号 )方法来实现,注意 : Move() 方法是相对于当前记 录来移动指针位置的,正值向后移动、负值向前移动,如: Move(3) ,当前记录是 3 时,它 将从记录 3 开始往后再移动 3 条记录位置。
代码如下所示:try{int curSel = m_AccessList.GetCurSel();// 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针m_pRecordset->MoveFirst();m_pRecordset->Move(long(curSel));catch(_com_error *e)AfxMessageBox(e->ErrorMessage());l 修改记录中字段值可以将记录指针移动到要修改记录的位置处,直接用PutCollect( 字段名,值 )将新值写入并 Update() 更新数据库既可可以用上面方法移动记录指针,修改字段值代码如下所示:try{。
