第十二章ADO编程技术_第1页
第十二章ADO编程技术_第2页
第十二章ADO编程技术_第3页
第十二章ADO编程技术_第4页
第十二章ADO编程技术_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十二:ado编程技术学习目标 ado编程技术简介 ado对象结构使用ado控件访问数据使用ado对象访问数据ado编程技术简介三种数据库数据库访问技术介绍: odbc (open database connectivity,开放式数据库连接),是一 种用来在相关或不相关的数据库管理系统(dbms)中存取数据的标准应 用程序接口(api)o dao (data access obj ect )即数据访问对象集,是 microsoft 提 供的基于一个数据库对彖集合的访问技术。和odbc 样,他们都是 windows api的一部分,可以独立于(dbms)进行数据库的访问。dao跟odbc的区别

2、是:访问机制不同! odbc工作依赖于数据库制造商 提供的驭动程序。使用odbcapi的时候,windows的odbc管理程序, 把对数据库的访问请求传递给正确的驱动程序,驱动程序再使用sql语 句指示dbms完成数据库访问工作。ado则绕开屮心环节,直接使用数据 库弓|擎(microsoft jet database engine)提供的数据库访问对 象集进行工作。速度比odbc快。 ado (activex data object)是microsoft数据库应用程序开发的 新接口,是建立在0ledb之上的高层数据库访问技术,提供了简单易用的访问各种数据资源(包括关系型和非关系型)。是相对比

3、较新的数据库 访问技术。ado是microsoft数据库应用程序开发的新接口,是建立在ole db之上 的高层数据库访问技术,请不必为此担心,即使你对0ledb, com不了解也 能轻松对付ado,因为它非常简单易用,甚至比你以往所接触的odbc api. dao、rdo都要容易使用,并不失灵活性。本文将详细地介绍在vc下如何使 用ado来进行数据库应用程序开发。ado对象结构ado是一个面向对象的组件库,用ado访问数据库,其实就是利用ado对象 来操作数据如的数据,所以我们首先耍撑握ado的对象 连接对象(connection):连接用于与数据库建立连接,执行查询及进行事务处理。在连接吋必

4、须要指 定使用何种数据库的0ledb供应者 命令对象(command):可以执行数据库操作命令(如查询,修改,增加和删除)。用命令对彖执行一 个杳询字吊,可以返回一个记录集合。 记录集对象(recordset):用于表示查询返回的结果集,它可以在结果集中增加,删除,修改和移动刻 录。当建立一个记录集时,一个游标就口动建立了,查询所产生的记录就放 在本地的游标中,游标冇四种类型:仅能向前移动的游标,静态游标,键集 游标和动态游标。记录集对象是对数据库进行查询和修改的主要对象。 字段对象(fields字段集合对象,field字段对象):字段对象用于表示数据库或记录集中的信息,包括列值等信息。一个记

5、录集 或一个数据库中的表包括了多行记录,若将其当做二维网格,字段将是网格 中的列,每个字段分别有名称,数据类型和值等属性,字段中包折了来自数 据库源屮的真实数据。要修改其小的数据可在集录集修改filed字段对象, 也可以通过在刻录集中访问fields字段集合对象,再定位要修改的filed 字段对象。对记录集的修改将最终被传送给数据库。 参数对象(parameter):是和命令对彖联用的一个对彖。当命令对象执行的查询是一个有参数的查询 时,就要用参数对象來为命令对象提供参数信息和数据。使用ado访问数据库有两种方式: 通过ado控件访问数据库通过ado对彖访问数据库下面我们将详细讲述这两种访问数

6、据库的方法。使用ado控件访问数据库access 2000是microsoft office中的一个组件,是一个小型的桌面数 据系统,我们将以它为例子,讲解使用ado控件访问数据库的方法。 在access 2000建立空数据库(参见access 2000操作信息) 在空数据库中建立一个名称为test的一个表(参见access 2000操作 信息)建立一个vc的基于对话框的程序框架(也可以是其它向导建立手框架)在对话框界面编辑器小增加一个ado控件。ado控件有多种类型: ado data连接控件,用于方便建立数据连接 ado grid控件,用于表示一个记录结果集在对话框编辑器,右键菜单屮选择i

7、nsert activex control,在出现的 对话扌匡中选择 microsoft ado data control z version 6.0,点 ok h 卩 可以将连接控件加入到对话框小,同样方法选择microsoft ado grid control z version 60加1入至u对话框中。设置对话框中连接控件的屈性上述两个控件的属性设置和vc中其它控件的设置是一样的。连接控件的属性设置:在属性对话框小选择control页面,选择use connection string选项,点build按钮,在出现的对话框中选择 microsoft jet 4.0 oledb provid

8、er提供者。点下一步选择刚建立的 access 2000数据文件名称。点测试连接应能连接数据库通过。再一次打开连接控件的属性设置,选择recordesource贞面,在command type 屮选择 2-adcmdtable, 在 table or storedprocedure name中选择刚建立的test的表。到此完成一连接控件的设置。设置对话框中grid控件的属性 同样方法打开grid控件的屈性对话框。选择control页而,选屮allow addnew和allow delete复选框,再选择all页面,设置datasource 参数为连接控件的id运行该程序将可以在对话框中连接数据

9、库,并取岀表中的数据显示在grid控件屮。使用ado对象访问数据库ado数据库开发的基本流程初始化com库,引入ado库定义文件用connection对象连接数据库 利用建立好的连接,通过connection command对象执行sql命令, 或利用recordset对象取得结果记录集进行查询、处理。使用完毕后关闭连接释放对彖。我们采用access数据库,您也可以直接在我们提供的示例代码中找到这个 test.mdbo下面我们将详细介绍上述步骤并给出和关代码。com库的初始化我们可以使用afxolelnit ()来初始化com库,这项工作通常在 cwinapp: : initlnstance

10、()的重载函数中完成,请看如下代码:bool cjkdotestlapp : : initlnstance () afxolelnit (); 用#import指令引入ado类型库我们在stdafx.h屮加入如下语句:(stdafx.h这个文件哪里可以找到?你 可以在fileview中的header files里找到)#import "c : program filescommon filessystemadomsadol5no_namespace rename("eof","adoeof")这一语句有何作用呢?其最终作用同我们熟悉的#incl

11、ude类似,编译的吋 候系统会为我们生成msadol5tzlh, adol5tzli两个c+ +头文件来定义 ado 库 o几点说明: 您的环境+ msadol5.dll不一定在这个目录下,请按实际情况修改在编译的时候肯能会出现如卜警告,对此微软在msdn中作了说明,并建 议我们不要理会这个警告。msadol5 tlh(405) : warning c4146: unary minus operatorapplied to unsigned type, result still unsigned创建connection对象并连接数据库首先我们需要添加一个指向connection对彖的指针:_c

12、onnectionptr m_pconnection;下面的代码演示了如何创建connection对象实例及如何连接数据库并进行 异常捕捉。bool cadotestldlg:onlnitdialog()cdialog:onlnitdialog();hresult hr;tryhr=m_pconnection. create instance ( "adodb connection" ) ; / 仓 建 connection 对象if(succeeded(hr)hr=m_pconnection- >open (11 provider=microsof t jet.ol

13、edb . 4.0 ;d ata source=test. mdb,f, n n , ,f h, admodeunknown);/连接数据库/上面一句中连接字串中的provider是针对 access2000 环 境 的, 对 于 access97, 需 要 改 为:provider=microsoft.jetoledb.3.51;catch ( com error 巳)/扌甫捉界'常cstring errormessage;errormessage . format ("连接数据库失败! r 错误信:%s"z e errormessage();afxmessage

14、box (errormessage) ; / /.显刀错误彳言,息在这段代码屮我们是通过connection对象的open方法来进行连接数据库 的,下面是该方法的原型hresult connection: :open (_bstr_t connectionstring, _bstr_tuserid, _bstr_t password, long options )其i" connectionstring为连接字/出zuserid是用户名,password是登 录密码,options是连接选项,用于指定connection对象对数据的更新许 权,options可以是如下几个常量: ad

15、modeunknown:缺省。当前的许可权未设置 admoderead: admodewrite :只写 admodereadwrite :可以读'弓 admodesharedenyread:阻止其它connection对象以读权限打开连 接 admodesharedenywrite :阻止其它connection对象以写权限打开 连接 admodeshareexclusive :阻止其connection 象扌丁开连接 admodesharedenynone :允许其它程序或对象以任何权限建立连接。我们给出一些常用的连接方式供人家参考: 通过jet数据库引擎对access2000数据

16、库的连接 m_pconnection->open("provider=microsoft.jet.oledb.4 0;data source=c: test.mdb" z " z " ", admodeunknown); 通过dsn数据源对任何支持odbc的数据库进行连接: m_pconnection->open("datasource=adotest;uid=sa;pwd=,admodeunknown); 不通过dsn对sql server数据库进行连接:m_pconnection->open("driv

17、er=sqlserver;server=127 0 0.l;database=vckbase;uid=sa;pwd=13 9n , ' " z n " z admodeunknown);其中server是sql服务器的名称,database是库的名称connection对彖除open方法外还有许多方法,我们先介绍connection x、j象中两个冇用的属性 connectiontimeout 与 state connectiontimeout用来设置连接的超时时间,需要在open z前调用, 例如:m_p conne c t i on - > conne c

18、 t i ont i me ou t = 5;/设置超时时间为 5 秒 m_pconnection->open("datasource=adotest;","",""z admodeunknown);state属性指明当币j connection对象的状态,0表示关闭,1表示已经打 开,我们可以通过读取这个属性来作相应的处理,例如:if(m_pconnection->state) m_pconnection->close(); /女口果已经打开了连接则关闭它执行sql命令并取得结果记录集 为了取得结果记录集,我们定义

19、一个指向recordset对彖的指 针:_recordsetptr m_precordset ;并为其仓u建 recordset 对象的实例: m_precordset create 工 nstance ( "adodb .records t”) ; sql 命令 fl勺 执行可以采用多种形式,下面我们一进行阐述。1) 利用connection对象的execute方法执彳亍sql命令,execute方法 的原型如下所示:_recordsetptr connectionl5 : : execute ( _bstr_t commandtext,variant * recordsaffec

20、ted, long options )其中commandtext是命令字串,通常是sql命令。参数recordsaf f ected 是操作完成后所影响的行数,参数options表示commandtext中内容的类 型,options可以取如下值之一: adcmdtext:表明 commandtext 是文本命令 adcmdtable :表明 commandtext 是一个表名 adcmdproc :表明commandtext是一个存储过程 adcmdunknown:未知iexecute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作 说明。_variant_t recordsaff

21、eeted;/衣1行sql命令:create table仓建表格users , users包含四个字段: 整形id,字符串username,整形old, tl期型birthdaym_p conne c t i on->execute("createtableusers(idintegerzusernametext,oldinteger,birthdaydatetime) j&recordsaf f ected, adcmdtext);/往表格里面添加记录m_pconnection->execute("insertintousers(id,username

22、,old,birthday)values(1,'washington 1z25z*1970/1/1'&recordsaffeeted,adcmdtext );/将所有记录old字段的值加一m_pconnection->execute("update users set old = old+1"z &recordsaffeeted,adcmdtext);/执行sql统计命令得到包含记录条数的记录集m_precordset = m_pconnection->execute("select count(*)from users

23、",&recordsaffected,adcmdtext);_variant_t vlndex = (long)0;_variant_t vcount = m_precordset->getcollect(vlndex);/取得第一个字段的值放入vcount变量m_precordset->close();/关闭记录集cstring message;message . format (”共有d 条记录"z vcount. lval);afxmessagebox(message);/显示当前记录条数2) 利用command对象来执行sql命令_command

24、ptr m_pcommand;m_pcommandcreatelnstance("adodb.commandh);_variant_t vnull;vnull.vt = vt_error;vnull.scode = disp_e_paramnotfound;/定义为无参数m_pcommand->activeconnection = m_pconnect ion;/非常关键的一句,将建立的连接赋值给它m_pcommand->commandtext = hselect * from usersn;/命令字串m_precordset=m_pcommand->execute

25、(&vnull,&vnull,adcmdtext);/执行命令,取得记录集在这段代码中我们只是用command对象来执行了 select查询语句,command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详 细介绍。3) 直接用recordset对象进行查询取得记录集。例如:m_precordset->open(n select*fromusers11, _variant_t ( (idispatch*)m_pconne c t i on,true),adopenstatic,adlockoptimistic,adc mdtext);open方法的原型是这样的

26、:hresult recordsetl5 : :open ( const _variant_t & source, const _variant_t & activecormection, enum cur s o rtype enum cursortype, enum locktypeenum locktype, long options ) 其中: source是数据查询字符串 activeconnection是已经建v.好的连接(我们需耍用connection对象指1针来构造一v'variantt:对象)cursortype光标类型,它可以是以下值z,请看这个枚举

27、结构: enum cursortypeenumadopenunspecified = -1,/不作特别指定adopenforwardonly = 0,/前滚静态光标。这种光标只能向前浏览记录集,比如用 movenext向前滚动,这种方式可以提高浏览速度。但诸如 bookmark,recordcount,absoluteposition,absolutep age都不能使用adopenkeyset = 1,/采用这种光标的记录集看不到其它用户的新增、删除操作,但 对于更新原冇记录的操作对你是可见的。adopendynami c = 2,/动态光标。所有数拯库的操作都会立即在各用户记录集上反 应出

28、來。adopenstatic = 3/静态光标。它为你的记录集产生一个静态备份,但其它用户的 新增、删除、更新操作对你的记录集來说是不可见的。; locktype锁定类型,它可以是以下值之一,请看如下枚举结构:enum locktypeenumadlockunspecified = -1,/未指定adlockreadonly = 1,/只读记录集adlockpessimistic = 2,/悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全 的锁定机制adlockoptimistc = 3,/乐观锁定方式。只有在你调用update方法时才锁定记录。在 此之前仍然可以做数据的更新、插入、删除

29、等动作 adlockbatchoptimistic = 4,/乐观分批更新。编辑吋记录不会锁定,更改、插入及删除是在批处理模式下完成。;options请参考木文中对connection对象的execute方法的介绍记录集的遍历、更新根据我们刚才通过执行sql命令建立好的users表,它包含四个字段:工d ,username,old,birthday以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,更改其年龄,保存到数据库。_variant_t vusername,vbirthday,vid,void;_recordsetptr m_precordse

30、t;m_precordsetcreateinstance(hadodb.recordsetn);m_precordset- >open("select*fromusers11 ,_variant_t ( (idispatch*) m_pconnection, true) , adope nstatic,adlockoptimistic,adcmdtext);while(!m_precordset->adoeof)/这里为什么是adoeof而>是丘0片呢?还i己彳寻匕ename ( ”eof1', nadoeofn )这一句吗? vid = m_precord

31、set->getcollect(_variant_t(long)0);/取得第1列的值,从0开始计数,你也可以直接给出列的名称,如下一行vusername = m_precordset->getcollect("username");/取得username字段的值vold = m_precordset->getcollect("old");vbirthday = m_precordset->getcollect("birthday");/在debug方式下的0utput窗口输出记录集屮的记录if (vid vt

32、 ! = vt_null && vusername.vt ! = vt_null && vold vt !=vt_null && vbirthday.vt != vt_null)trace ("id: %dz 姓 名 :%s, 年 龄:%d,生日:%sr",vid.lval, (lpctstr) (_bstr_t)vusernamez vold.lvalz ( lpctstr)(_bstr_t)vbirthday);m_precordset->movenext();/移到下一条记录m_precordset->mov

33、efirst();/移至 ii 首条 i 己录 m_precordset- >delete (adaf feet current);/删除当前记录/添加三条新记录并赋值for(int i=0;i<3;i+)m_precordset 一 >addnew () ; /添力u新记录m_precordset->putcollect("id",_variant_t(long)(i+10);m_precordset->putcollect("username",_variant_t(" 叶 利 钦”);m_precordset

34、->putcollect(holdn z_variant_t(long)71)m_precordset->putcollect(hbirthdayn,_variant_t(n1930-3-15");m_precordset->move(1z _variant_t(long)adbookmarkfirst)/从第一条记录往下移动一条记录,即移动到第二条记录处m_precordset->putcollect(_variant_t("old")z_variant_t( long)45);/修改其年龄m_precordset->update(

35、);/保存到库中关闭记录集与连接记录集或连接都可以用close方法来关闭m_precordset->close () ;/关闭记录集m_p connect ion - >close () ; /关闭连接至此,我们已经熟悉了 ado操作数据库的大致流程,也许您己经胸有成竹, 也许您还有点胡涂,不要紧!建议你尝试写儿个例子,这样会更好地熟悉ado, 最后我给大家写了一个小例子,例子中读出所冇记录放到列表控件中、并可 以添加、删除、修改记录。例1:通过ado控件访问数据严格按课中所说,应能够建立一个简单的基于ado控件访问数据库的程序。请大家自行做一下。例2:通过ado对象实现数据的访问

36、一一演示一个学生信息的录入和管理程 序1)建立一个access 2000的数据库student .mdb,建立一个表,名称student,字段分别为:sno 数字name-字串birthday fl 期englishgrad四级成绩computergradevc 成绩2)在一个临时的vc程序中通过ado连接控件得到access 2000的数据库student. mdb的连接字串3 )建立一个正式的基于对话框的mfc程序4)建立下而对话框界而,其中的每个控件的屈性设置如下。(应用程序对话框界面)(对话框上各控件屈性设置)控件类型属性值对应的成员变量分组框控件ididc staticcaption

37、学石言息编辑框控件ididc edit1m noididc edit2m nameididc_edit3m_addressididc_edit4m_dateididc edit5m score按钮idid okcaption确定ididc button1captionnextididc button2captionprevididc button3captionlastididc_button4captionfirstididc button2captionaddididc button2captiondeleteididc button2captionsave5)对话框类屮的成员变量定义:c

38、stringm_no ;cstringm_name;cstringm_address;cstringm_date;cstringm score;connectionptr m_pcon;_recordsetptr m_prs;_variant_t vfieldvalue;6) 对话框类中的初始化中的数据连接初始化功能m_pcon.createlnstance(uuidof(connection);m_pcon->open("provider=microsoft jet oledb.4.0 source=dbl.mdb;persist security info=false&qu

39、ot;i! vi”",-1)/h provider=microsoft.jet.oledb.40;datasource=e:myvcvcno9-adodbl.mdb"/ / " provider=microsof t jet oledb 4.0 ;data source=c : 课程vcno9-adodbl.mdb;persist security info=false" m_prscreate工nstance(uuidof(recordset);m_prs->open(n select * from testn,m_pcon.getinterfa

40、ceptr(), adopendynamic,adlockoptimistic,adcmdtext); m_prs->movefirst();dispfileds();7) dispfileds ()函数用于更新对话框显示。定义如下:void cadobjectdlg:dispfileds()vfieldvalue=m_prs->getcollect("no");strfiledvalue = (char*)_bstr_t(vfieldvalue);m_no = strfiledvalue;vfieldvalue.clear();vfieldvalue=m_pr

41、s->getcollect("name");if (vfieldvalue.vt !=vt_null)strfiledvalue = (char*)_bstr_t(vfieldvalue); elsestrfiledvalue ="";m_name = strfiledvalue;vfieldvalue.clear();vfieldvalue=m_prs->getcollect("address");if (vfieldvalue vt!=vt_null)strfiledvalue = (char*)_bstr_t(vfieldvalue);elsestrfiledvalue =h n ;m_address = strfiledvalue;vfieldvalue.clear();vfieldvalue=m_prs->getcollect("date");if (vfieldvalue.vt!=vt_null)strfiledvalue = (char*)_bstr_t(vfieldvalue); elsestrfiledvalue ="n;m_date = strfiledvalue;vfieldval

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论