直接通过ADO操作Access数据库.doc

上传人:飞****2 文档编号:56547755 上传时间:2022-11-02 格式:DOC 页数:9 大小:43.50KB
返回 下载 相关 举报
直接通过ADO操作Access数据库.doc_第1页
第1页 / 共9页
直接通过ADO操作Access数据库.doc_第2页
第2页 / 共9页
点击查看更多>>
资源描述

《直接通过ADO操作Access数据库.doc》由会员分享,可在线阅读,更多相关《直接通过ADO操作Access数据库.doc(9页珍藏版)》请在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这种数据库访问技术。ADO的操作方法和前面讲过的DAO的操作在很多方面存在相似之处,在这里,笔者为了更有效的说明它的使用方法,用VC6.0做了一个示例程序AdoRWAccess,这个示例程序可以直接通过ADO来操作Access数据库,示例程序的运行效果如下图所示: 在示例程序中我们仍采用原库结构,数据库名D

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

4、mon filessystemadomsado15.dll no_namespace rename (EOF, adoEOF) 其中路径名可以根据自己系统安装的ADO支持文件的路径来自行设定。当编译器遇到#import语句时,它会为引用组件类型库中的接口生成包装类,#import语句实际上相当于执行了API涵数LoadTypeLib()。#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,CLSID等进行声明,创建一系列包装方法。语句no_namespace说明

5、ADO对象不使用命名空间,rename (EOF, adoEOF)说明将ADO中结束标志EOF改为adoEOF,以避免和其它库中命名相冲突。 其次,在程序初始过程中需要初始化组件,一般可以用CoInitialize(NULL);来实现,这种方法在结束时要关闭初始化的COM,可以用下面语句CoUnInitialize();来实现。在MFC中还可以采用另一种方法来实现初始化COM,这种方法只需要一条语句便可以自动为我们实现初始化COM和结束时关闭COM的操作,语句如下所示: AfxOleInit(); 接着,就可以直接使用ADO的操作了。我们经常使用的只是前面用#import语句引用类型库时,生成

6、的包装类.tlh中声明的智能指针中的三个,它们分别是_ConnectionPtr、_RecordsetPtr和_CommandPtr。下面分别对它们的使用方法进行介绍:1、_ConnectionPtr智能指针,通常用于打开、关闭一个库连接或用它的Execute方法来执行一个不返回结果的命令语句(用法和_CommandPtr中的Execute方法类似)。打开一个库连接。先创建一个实例指针,再用Open打开一个库连接,它将返回一个IUnknown的自动化接口指针。代码如下所示: _ConnectionPtrm_pConnection;/ 初始化COM,创建ADO连接等操作AfxOleInit();

7、m_pConnection.CreateInstance(_uuidof(Connection);/ 在ADO操作中建议语句中要常用try.catch()来捕获错误信息,/ 因为它有时会经常出现一些意想不到的错误。jingzhou xutry / 打开本地Access库Demo.mdbm_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb,adModeUnknown);catch(_com_error e)AfxMessageBox(数据库连接失败,确认数据库Demo.mdb是否在当前路径下!);retu

8、rn FALSE; 关闭一个库连接。如果连接状态有效,则用Close方法关闭它并赋于它空值。代码如下所示: if(m_pConnection-State) m_pConnection-Close();m_pConnection= NULL; 2、_RecordsetPtr智能指针,可以用来打开库内数据表,并可以对表内的记录、字段等进行各种操作。打开数据表。打开库内表名为DemoTable的数据表,代码如下: _RecordsetPtrm_pRecordset;m_pRecordset.CreateInstance(_uuidof(Recordset);/ 在ADO操作中建议语句中要常用try.

9、catch()来捕获错误信息,/ 因为它有时会经常出现一些意想不到的错误。jingzhou xutrym_pRecordset-Open(SELECT * FROM DemoTable, / 查询DemoTable表中所有字段theApp.m_pConnection.GetInterfacePtr(), / 获取库接库的IDispatch指针adOpenDynamic,adLockOptimistic,adCmdText);catch(_com_error *e)AfxMessageBox(e-ErrorMessage(); 读取表内数据。将表内数据全部读出并显示在列表框内,m_AccessL

10、ist为列表框的成员变量名。如果没有遇到表结束标志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-ad

11、oEOF)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);ca

12、tch(_com_error *e)AfxMessageBox(e-ErrorMessage(); 插入记录。可以先用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_pRecord

13、set-Update();AfxMessageBox(插入成功!);catch(_com_error *e)AfxMessageBox(e-ErrorMessage(); 移动记录指针。移动记录指针可以通过MoveFirst()方法移动到第一条记录、MoveLast()方法移动到最后一条记录、MovePrevious()方法移动到当前记录的前一条记录、MoveNext()方法移动到当前记录的下一条记录。但我们有时经常需要随意移动记录指针到任意记录位置时,可以使用Move(记录号)方法来实现,注意: Move()方法是相对于当前记录来移动指针位置的,正值向后移动、负值向前移动,如:Move(3)

14、,当前记录是3时,它将从记录3开始往后再移动3条记录位置。代码如下所示: tryint curSel = m_AccessList.GetCurSel();/ 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针m_pRecordset-MoveFirst();m_pRecordset-Move(long(curSel);catch(_com_error *e)AfxMessageBox(e-ErrorMessage(); 修改记录中字段值。可以将记录指针移动到要修改记录的位置处,直接用PutCollect(字段名,值)将新值写入并Update()更新数据库既可。可以用上面方法移

15、动记录指针,修改字段值代码如下所示: 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)AfxMessageBox(e-ErrorMessage(); 删除记录。删除记录和上面修改记录的操作类似,先将记录指针移动到要修改记录的位置,直接用Dele

16、te()方法删除它并用Update()来更新数据库既可。代码如下所示: try/ 假设删除第二条记录m_pRecordset-MoveFirst();m_pRecordset-Move(1); / 从0开始m_pRecordset-Delete(adAffectCurrent); / 参数adAffectCurrent为删除当前记录m_pRecordset-Update();catch(_com_error *e)AfxMessageBox(e-ErrorMessage(); 关闭记录集。直接用Close方法关闭记录集并赋于其空值。代码如下所示: m_pRecordset-Close();m_

17、pRecordset = NULL; 3、CommandPtr智能指针,可以使用_ConnectionPtr或_RecordsetPtr来执行任务,定义输出参数,执行存储过程或SQL语句。 执行SQL语句。先创建一个_CommandPtr实例指针,再将库连接和SQL语句做为参数,执行Execute()方法既可。代码如下所示: _CommandPtrm_pCommand;m_pCommand.CreateInstance(_uuidof(Command);m_pCommand-ActiveConnection = m_pConnection; / 将库连接赋于它m_pCommand-Comman

18、dText = SELECT * FROM DemoTable; / SQL语句m_pRecordset = m_pCommand-Execute(NULL, NULL,adCmdText); / 执行SQL语句,返回记录集 执行存储过程。执行存储过程的操作和上面执行SQL语句类似,不同点仅是CommandText参数中不再是SQL语句,而是存储过程的名字,如Demo。另一个不同点就是在Execute()中参数由adCmdText(执行SQL语句),改为adCmdStoredProc来执行存储过程。如果存储过程中存在输入、输出参数的话,需要使用到另一个智能指针_ParameterPtr来逐次设

19、置要输入、输出的参数信息,并将其赋于_CommandPtr中Parameters参数来传递信息,有兴趣的读者可以自行查找相关书籍或MSDN。执行存储过程的代码如下所示: _CommandPtrm_pCommand;m_pCommand.CreateInstance(_uuidof(Command); m_pCommand-ActiveConnection = m_pConnection; / 将库连接赋于它m_pCommand-CommandText = Demo; m_pCommand-Execute(NULL,NULL, adCmdStoredProc); 最后,如果想知道详细实现细节的话

20、,可以在下载示例源码后,仔细查看源码既可(内有详细注释)。 联系方式: 地址:陕西省西安市劳动路2号院六单元 邮编: 作者EMAIL:jingzhou_xu 未来工作室(Future Studio)在网上找了几个,基本上都差不多,好像还是个好一点类似于ASP写的那种rs(name)=name我喜欢这种的,不喜欢那种vSQL=INSERTINTOTABLE(name)values(?这后面不会写+name+这个好麻烦,一直没看懂,有哪位大哥指点下谢谢了 ( Leeu2005 发表于 2005-10-3 10:53:00)有的书上都用这代码作例子!作者真强 ( bluemagnate 发表于 20

21、05-8-1 17:18:00)带有密码的连接:Provider=Microsoft.Jet.OLEDB.4.0;DataSource=test.mdb;PersistSecurityInfo=False;JetOLEDB:DatabasePassword=haha ( hongpenghe 发表于 2005-5-10 12:00:00)请问是不是在office2000中的access2000在密码方面有问题,我听说office97可以正常用VC库接带密码的数据库可是office2000不行 ( karllere 发表于 2004-8-24 19:33:00)这个程序在98上不能运行,请问是怎

22、么回事? ( yifansdut 发表于 2004-7-19 9:29:00)_variant_tvar;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-Move

23、Next(); 烦请解答以下几个问题,我已经查了很多资料但还是对以下代码不太理解。在这段代码中,_variant_tvar;是定义什么类型的数据值?if(var.vt!=VT_NULL)strAge=(LPCSTR)_bstr_t(var);作用是什么?分别什么意思?以上这些我在什么地方可以找到更为详细的说明?( forever18 发表于 2003-12-9 9:35:00)我是用:m_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Demo.mdb;UserId=*;Password=*,adModeUnknown)

24、;这种方式直接访问数据库的,能够正常编绎/运行后也可以从程序的界面中打开指定的ACCESS库,但最不知道是怎么啦,编绎后运行程序却不能连接到ACCESS库啦不知道是为什么,但换一台机子又可以啦连接上偏我那台就不行而且在编绎时都好好的/( xdpxyshhyh 发表于 2003-12-5 15:17:00)把连接语句改成下面的样子m_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Demo.mdb;UserId=*;Password=*,adModeUnknown);*改成你的用户名、密码( komichen 发表于 2003-11-10 15:30:00)请教:如果access数据库有密码,怎么建立连接,谢谢指教。这个问题很多人写关于ADO的文章都不谈,其实很容易出错,请指点 ( zhwang_2 发表于 2003-7-4 0:21:00)很好,很实用!谢谢 ( 探索者 发表于 2003-6-13 14:31:00)

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

当前位置:首页 > 教育专区 > 教案示例

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

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