2022年通过ADO访问数据库技术 .pdf

上传人:H****o 文档编号:33657187 上传时间:2022-08-12 格式:PDF 页数:6 大小:103.04KB
返回 下载 相关 举报
2022年通过ADO访问数据库技术 .pdf_第1页
第1页 / 共6页
2022年通过ADO访问数据库技术 .pdf_第2页
第2页 / 共6页
点击查看更多>>
资源描述

《2022年通过ADO访问数据库技术 .pdf》由会员分享,可在线阅读,更多相关《2022年通过ADO访问数据库技术 .pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、我在 VC 知识库在线杂志第十四期和第十五期上曾发表了两篇文章“直接通过ODBC 读、写 Excel 表格文件” 和“直接通过DAO 读、写 Access 文件”,先后给大家介绍了 ODBC 和 DAO 两种数据库访问技术的基本使用方法,这次要给大家介绍的是ADO 数据库访问技术的使用方法。 ADO(Active Data Object , 活动数据对象 )实际上是一种基于COM(组件对象模型 )的自动化接口 (IDispatch) 技术 , 并以 OLE DB (对象连接和镶入的数据库)为基础,经过 OLE DB 精心包装后的数据库访问技术,利用它可以 快速的创建数据库应用程序。ADO提供了

2、一组非常简单,将一般通用的数据访问细节进行封装的对象。由于 ODBC 数据源也提供了一般的OLE DB Privider ,所以 ADO 不仅可以应用自身的OLE DB Privider ,而且还可以应用所有的ODBC 驱动程序。 关于 OLE DB 和 ADO 的其它详细情况, 读者可以自行查阅相关书籍或MSDN ,这里就不一一说明了。让我们直接步入主题:如何掌握 ADO 这种数据库访问技术。AD O 的操作方法和前面讲过的DAO 的操作在很多方面存在相似之处,在这里, 笔者为了更有效的说明它的使用方法,用 VC6.0 做了一个示例程序AdoRWAccess,这个示例程序可以直接通过ADO

3、来操作 Access数据库,示例程序的运行效果如下图所示:在示例程序中我们仍采用原库结构,数据库名Demo.mdb ,库内表名DemoTable,表内字段名为 Name(姓名 )和 Age(年龄 )的两个字段,来构造示例程序操作所需的Access 数据库,这也和上两篇文章的示例源码中的库结构相兼容。下面让我们看看ADO 数据库访问技术使用的基本步骤及方法:首先,要用 #import 语句来引用支持ADO 的组件类型库 (*.tlb) ,其中类型库可以作为可执行程序 (DLL 、EXE 等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll 的附属资源中,只需要直接用#

4、import 引用它既可。可以直接在Stdafx.h 文件中加入下面语句来实现:#import c:program filescommon filessystemadomsado15.dll no_namespace rename (EOF, adoEOF) 其中路径名可以根据自己系统安装的ADO支持文件的路径来自行设定。当编译器遇到#import 语句时, 它会为引用组件类型库中的接口生成包装类,#import 语句实际上相当于执行了 API 涵数 LoadTypeLib() 。#import 语句会在工程可执行程序输出目录中产生两个文件,名师资料总结 - - -精品资料欢迎下载 - - -

5、 - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - 分别为 *.tlh( 类型库头文件)及 *.tli( 类型库实现文件),它们分别为每一个接口产生智能指针,并为各种接口方法、 枚举类型,CLSID 等进行声明, 创建一系列包装方法。 语句 no_namespace说明 ADO 对象不使用命名空间, rename (EOF, adoEOF) 说明将 ADO 中结束标志EOF 改为 adoEOF,以避免和其它库中命名相冲突。其次, 在程序初始过程中需要初始化组件,一般可以用CoInit

6、ialize(NULL);来实现,这种方法在 结束时要关闭初始化的COM ,可以用下面语句CoUnInitialize(); 来实现。 在 MFC中还可以采用另一种方法来实现初始化COM ,这种方法只需要一条语句便可以自动为我们实现初始化COM 和结束时关闭COM 的操作 ,语句如下所示:AfxOleInit(); 接着,就可以直接使用ADO 的操作了 。我们经常使用的只是前面用#import 语句引用类型库时,生成的包装类.tlh 中声明的智能指针中的三个,它们分别是_ConnectionPtr 、_RecordsetPtr 和_CommandPtr。下面分别对它们的使用方法进行介绍:1、

7、_ConnectionPtr 智能指针 ,通常用于打开、关闭一个库连接或用它的Execute 方法来执行一个不返回结果的命令语句(用法和 _CommandPtr 中的 Execute 方法类似 )。打开一个库连接。先创建一个实例指针,再用Open 打开一个库连接,它将返回一个IUnknown 的自动化接口指针。代码如下所示:_ConnectionPtr m_pConnection; / 初始化 COM, 创建 ADO 连接等操作AfxOleInit(); m_pConnection.CreateInstance(_uuidof(Connection); / 在 ADO 操作中建议语句中要常用

8、try.catch()来捕获错误信息,/ 因为它有时会经常出现一些意想不到的错误。jingzhou xu try / 打开本地Access库 Demo.mdb m_pConnection-Open( Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb,adModeUnknown); catch(_com_error e) AfxMessageBox( 数据库连接失败,确认数据库Demo.mdb 是否在当前路径下!); return FALSE; 关闭一个库连接。如果连接状态有效,则用Close 方法关闭它并赋于它空值。代码如下所示:if(

9、m_pConnection-State) m_pConnection-Close(); m_pConnection= NULL; 2、_RecordsetPtr 智能指针,可以用来打开库内数据表,并可以对表内的记录、字段等进行各种操作。打开数据表。打开库内表名为DemoTable 的数据表,代码如下:_RecordsetPtr m_pRecordset; m_pRecordset.CreateInstance(_uuidof(Recordset); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -

10、 - - 第 2 页,共 6 页 - - - - - - - - - / 在 ADO 操作中建议语句中要常用try.catch()来捕获错误信息,/ 因为它有时会经常出现一些意想不到的错误。jingzhou xu try m_pRecordset-Open(SELECT * FROM DemoTable, /查询 DemoTable 表中所有字段theApp.m_pConnection.GetInterfacePtr(), / 获取库接库的IDispatch 指针adOpenDynamic, adLockOptimistic, adCmdText); catch(_com_error *e)

11、AfxMessageBox(e-ErrorMessage(); 读取表内数据。将表内数据全部读出并显示在列表框内,m_AccessList 为列表框的成员 变 量 名 。 如 果 没 有 遇 到 表 结 束 标 志adoEOF , 则 用GetCollect( 字 段 名 ) 或m_pRecordset-Fields-GetItem( 字段名 )-Value 方法,来获取当前记录指针所指的字段值,然后再用MoveNext() 方法移动到下一条记录位置。代码如下所示:_variant_t var; CString strName,strAge; try if(!m_pRecordset-BOF)

12、 m_pRecordset-MoveFirst(); else AfxMessageBox( 表内数据为空 ); 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_AccessLis

13、t.AddString( strName + - +strAge ); m_pRecordset-MoveNext(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 6 页 - - - - - - - - - / 默认列表指向第一项,同时移动记录指针并显示m_AccessList.SetCurSel(0); catch(_com_error *e) AfxMessageBox(e-ErrorMessage(); 插入记录。可以先用AddNew() 方法新增一个空记录,

14、再用 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) AfxMessag

15、eBox(e-ErrorMessage(); 移动记录指针。 移动记录指针可以通过MoveFirst() 方法移动到第一条记录、MoveLast()方法移动到最后一条记录、MovePrevious() 方法移 动到当前记录的前一条记录、MoveNext()方法移动到当前记录的下一条记录。但我们有时经常需要随意移动记录指针到任意记录位置时,可以使用Move( 记录号 )方法来实现, 注意 : Move() 方法是相对于当前记录来移动指针位置的,正值向后移动、负值向前移动,如:Move(3) ,当前记录是3 时,它将从记录3 开始往后再移动3 条记录位置。代码如下所示:try int curSel

16、 = m_AccessList.GetCurSel(); / 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针m_pRecordset-MoveFirst(); m_pRecordset-Move(long(curSel); catch(_com_error *e) AfxMessageBox(e-ErrorMessage(); 修改记录中字段值。 可以将记录指针移动到要修改记录的位置处,直接用 PutCollect( 字名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -

17、第 4 页,共 6 页 - - - - - - - - - 段名,值 )将新值写入并Update()更新数据库既可。可以用上面方法移动记录指针,修改字段值代码如下所示:try / 假设对第二条记录进行修改m_pRecordset-MoveFirst(); m_pRecordset-Move(1); / 从 0 开始m_pRecordset-PutCollect(Name, _variant_ t(m_Name) ); m_pRecordset-PutCollect(Age, atol (m_Age) ; m_pRecordset-Update(); catch(_com_error *e) A

18、fxMessageBox(e-ErrorMessage(); 删除记录。删除记录和上面修改记录的操作类似,先将记录指针移动到要修改记录的位置,直接用Delete()方法删除它并用Update()来更新数据库既可。代码如下所示:try / 假设删除第二条记录m_pRecordset-MoveFirst(); m_pRecordset-Move(1); / 从 0 开始m_pRecordset-Delete(adAffectCurrent); / 参数 adAffectCurrent 为删除当前记录m_pRecordset-Update(); catch(_com_error *e) AfxMes

19、sageBox(e-ErrorMessage(); 关闭记录集。直接用Close 方法关闭记录集并赋于其空值。代码如下所示:m_pRecordset-Close(); m_pRecordset = NULL; 3、CommandPtr 智能指针 ,可以使用 _ConnectionPtr 或_RecordsetPtr 来执行任务,定义输出参数,执行存储过程或SQL 语句。执行SQL 语句。先创建一个_CommandPtr 实例指针,再将库连接和SQL 语句做为参数,执行 Execute()方法既可。代码如下所示:_CommandPtr m_pCommand; m_pCommand.CreateI

20、nstance(_uuidof(Command); m_pCommand-ActiveConnection = m_pConnection; / 将库连接赋于它m_pCommand-CommandText = SELECT * FROM DemoTable; / SQL 语句m_pRecordset = m_pCommand-Execute(NULL, NULL,adCmdText); / 执行 SQL 语句,返回记录集执行存储过程。执行存储过程的操作和上面执行SQL 语句类似,不同点仅是CommandText 参数中不再是SQL 语句, 而是存储过程的名字,如Demo。另一个不同点就名师资料

21、总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - - - - - - - 是在 Execute()中参数由 adCmdText(执行 SQL 语句 ), 改为 adCmdStoredProc 来执行存储过 程。如果存储过程中存在输入、输出参数的话, 需要使用到 另一个智能指针_ParameterPtr 来逐次设置要输入、 输出的参数信息,并将其赋于 _CommandPtr 中 Parameters参数来传递信息,有兴趣的读者可以自行查找相关书籍或MSDN 。执行

22、存储过程的代码如下所示:_CommandPtr m_pCommand; m_pCommand.CreateInstance(_uuidof(Command); m_pCommand-ActiveConnection = m_pConnection; / 将库连接赋于它m_pCommand-CommandText = Demo; m_pCommand-Execute(NULL,NULL, adCmdStoredProc); 最后,如果想知道详细实现细节的话,可以在下载示例源码后,仔细查看源码既可(内有详细注释 )。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁