《ADO数据库访问技术.ppt》由会员分享,可在线阅读,更多相关《ADO数据库访问技术.ppt(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、ADO技术介绍ADO是为Microfoft最新和最强大的数据访问接口OLEDB而设计的,是一个便于使用的应用程序层.OLEDB为任何数据源都提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件、文件系统、文本和图形以及自定义业务对象等.ADO在关键的Internet方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所用这些都是为了提供高性能的访问接口.同时ADO使用了与DAO相似的约定和特性,使得它易于学习.ADO历史ADO共发布1.0、1.5和2.0三个版本.第一个版本是RDO的一个功能子集,它的目标是为了帮助开发人员在IIS上建立ASP应用.第二个版本是随IIS4.
2、0和IE4.0一起发布的.从这个版本开始,ADO开始成为在功能和运作效率上都高出RDO和DAO的数据库界面.最新版本加入了新技术.ADO2.0实际上是基于MSADO15.DLL这个动态链接库的,这个库文件的名字虽然和ADO1.5的一样,但是它实现了更新的接口.ADO2.0新技术异步操作和事件模型数据集的持续性层次化的数据运输ADO特点概述第一、易于使用.ADO是高层数据库访问技术,所以相对ODBC来说,具有面向对象的特点.同时ADO对象结构中,对象与对象之间的层次结构不是非常明显,这会给编写数据库程序带来很多便利,比如,在应用程序中如果要使用记录集对象,就不一定要先建立连接会话对象,如果需要就
3、可以直接构造记录集对象.不必特别关心对象的层次机构和构造顺序.ADO特点概述第二、可以访问多种数据源。这一点和OLEDB是一样的,使应用程序具有很好的通用性和灵活性。第三、访问数据源效率高。这是由于ADO本身就是基于OLEDB的接口,自然具有OLEDB的特点。第四、方便地Web应用。这是由于ADO可以以ActiveX控件的形式出现,这就大大方便了Web应用程序的编制。第五、技术编程接口丰富。ADO支持VC、VB、VJ以及VBscript和JAVAscript脚本语言。ADO访问数据库的方法1.连接到数据源。2.指定访问数据源的命令,同时可带变量参数或优化执行。3.执行命令,例如一个SELECT
4、脚本。通常涉及ADO的Command对象或使用Connection对象的Execute方法。4.如果此命令使数据按表中行的形式返回(例如SELECT命令),则将这些行存储在易于检查、操作或更改的缓存中。5.适当情况下,可以把缓存行的更改内容写回数据库中,更新数据源。6.提供常规方法检测错误,涉及ADO的Error对象。ADO对象ADO中包含的对象:连接对象(Connection)命令对象(Command)记录集对象(Recordset)字段对象(Field)参数对象(Parameter)错误对象(Error)属性对象(Property)集合(Set)事件(Event).连接对象(Connect
5、ion)用于表示和数据源的连接,以及处理一些命令和事物.通过它可以从应用程序访问数据源,是交换数据所必须的环境.命令对象(Command)执行对数据库的查询,修改数据库结构等操作.记录集对象(Recordset)用于处理数据源的映像集.用于修改检索数据.字段对象(Field)用于描述数据集中的列信息,包含名称、数据类型和值的属性.要修改数据源中的数据,可以在记录集中修改Field对象的值,对记录集的更改最终送给数据库。参数对象(Parameter)用于对传递给数据源的命令赋参数值,在命令执行前进行更改.错误对象(Error)用于承载所产生错误的详细信息,如无法建立连接、执行命令等.属性对象(P
6、roperty)通过属性,每个ADO对象借此来让用户描述和控制自身的行为,分为内置和动态两种类型.内置对象是ADO对象的一部分并且随时可用。动态属性则由特别的数据提供者添加到ADO对象的属性集合中,仅在提供者被使用时才能存在。ADO对象集合(Set)集合是一种可以方便的包含其他特殊类型对象的对象类型.ADO提供四种类型的集合:Connection对象具有Errors集合。Command对象具有Parameters集合。Recordset对象具有Fields集合。ConnectionCommand、RecordsetField对象具有Properties集合。ADO对象事件(Event)事件模型
7、是异步操作的基础。这是ADO2.0引进的新特性。事件由事件处理程序例程处理,该例程在某个操作开始之前或结束之后被调用。某些事件是成对出现的。开始操作前调用的事件名格式为WillEvent(Will事件),而操作结束后调用的事件名格式为EventComplete(Complete事件)。其余的不成对事件只在操作结束后发生。(其名称没有任何固定模式。)事件处理程序由状态参数控制。附加信息由错误和对象参数提供。ADO事件是由某些操作在开始之前或结束之后发出的通知;所谓通知,实质上是对预定义的事件处理回调函数的调用。ADO事件分为两类:ConnectionEvent和RecordsetEvent。前者
8、出现在连接打开、切断,事务开始提交或命令被执行等与Connection对象有关的操作。后者出现在与记录集对象有关的操作。若按时间性质来分,ADO事件又可以分为WILL事件、COMPLETE事件和其他事件3类。顾名思义,WILL发生在某个操作之前,COMPLETE发生在某个操作完成之后。(一)使用Connection对象方法:Open函数的原型:HRESULTOpen(_bstr_tConnectionString,/连接字符串_bstr_tUID,/用户名_bstr_tPWD,/口令Longoption);/可选参数Close方法用于关闭数据库的连接。(一)使用Connection对象属性:C
9、onnectionString:连接字符串,指定用于建立连接数据源的信息。ConnectionTimeout:指示在终止尝试和产生错误之前执行命令需等待的时间,默认值为30秒。Mode属性:指定Connection对象修改数据的权限。Mode属性只能在关闭Connection对象时方可设置。Mode属性AdModeUnknown默认值。表明权限尚未设置或无法确定。AdModeRead表明权限为只读。AdModeWrite表明权限为只写。AdModeReadWrite表明权限为读/写。AdModeShareDenyRead防止其他用户使用读权限打开连接。AdModeShareDenyWrite防
10、止其他用户使用写权限打开连接。AdModeShareExclusive防止其他用户打开连接。AdModeShareDenyNone防止其他用户使用任何权限打开连接。(一)使用Connection对象使用Connection对象的Execute方法,可执行任何在指定连接的CommandText参数中传送给该方法的查询。如果CommandText参数指定按行返回的查询,执行产生的任何结果将存储在新的Recordset对象中。如果命令不是按行返回的查询,则提供者返回关闭的Recordset对象。返回的Recordset对象始终为只读、仅向前的游标。如需要具有更多功能的Recordset对象,应首先用
11、所需的属性设置创建Recordset对象,然后使用Recordset对象的Open方法执行查询并返回所需游标类型。CommandText参数的内容对提供者是特定的,并可以是标准的SQL语法或任何提供者支持的特殊命令格式。CommandText参数赋值,可为下列值之一。adCmdText指示提供者应将CommandText赋值为命令的文本定义。adCmdTable指示ADO应生成SQL查询以便从CommandText命名的表中返回所有行。adCmdTableDirect指示提供者应从CommandText命名的表中返回所有行。adCmdTable指示提供者应将CommandText赋值为表名。a
12、dCmdStoredProc指示提供者应将CommandText赋值为存储过程。adCmdUnknown指示CommandText参数中的命令类型未知。adExecuteAsync指示命令应该异步执行。adFetchAsync指示CacheSize属性指定的初始数量之后的行应异步提取。(一)使用Connection对象使用事务在数据库里,事务的概念可以把多个操作作为单一的基本活动来进行。在所有的操作开始之前调用Connection对象的BeginTrans方法来开始一个事物。所有的操作成功之后,调用Connection对象的CommitTrans方法提交事物。这时数据库的内容才做了实质性的改变
13、;如果中途出现异常,则在异常处理处使用RollBackTrans取消这次事物,数据库将回到事务前的状态。(二)使用Recordset对象记录集对象是ADO中最常用的对象,表示来自基本表或命令执行结果的记录全集。ActiveConnection属性属性通过设置通过设置ActiveConnection属性使打开属性使打开的连接与的连接与Command对象关联。对象关联。AbsolutePosition属性属性指定指定Recordset对象当前记录的序号位置。对象当前记录的序号位置。(二)使用Recordset对象BOF、EOF属性这两个属性用来判断记录指针是否越界。BOF、EOF为真时不能从结果集
14、中读取数据,否则会产生错误。打开Recordset时,当前记录位于第一个记录(如果有记录),并且BOF和EOF属性被设置为False。如果没有记录,BOF和EOF属性设置是True。(二)使用Recordset对象MaxRecord属性指定通过查询返回的记录最大数目。RecordCount属性返回RecordSet对象中记录的当前数目。Move属性在记录集中移动指针。假设提供者支持相关的功能,可以使用MoveFirst、MoveLast、MoveNext和MovePrevious方法以及Move方法,和AbsolutePosition、AbsolutePage和Filter属性来重新确定当前记
15、录的位置。仅向前Recordset对象只支持MoveNext方法。当使用Move方法访问每个记录(或枚举Recordset)时,可使用BOF和EOF属性查看是否移动已经超过了Recordset的开始或结尾。(二)使用Recordset对象Open方法:recordset.Open(Source,ActiveConnection,CursorType,LockType,Options)参数参数Source可选,变体型变体型,可以是Command对象的变量名、SQL语句、表名、存储过程调用或持久文件名。ActiveConnection可选。变体型变体型,可以是有效Connection对象变量名;或
16、字符串字符串,指明连接目标的字符串ConnectionString参数。CursorType可选,CursorTypeEnum值,确定提供者打开Recordset时应该使用的游标类型。可为下列常量之一。CursorType属性在打开Recordset之前设置CursorType属性来选择游标类型,或使用Open方法传递CursorType参数。部分提供者不支持所有游标类型。请检查提供者的文档。adOpenForwardOnly(默认值)打开仅向前类型游标。除仅允许在记录中向前滚动之外,其行为类似动态游标。这样,当需要在Recordset中单程移动时就可提高性能。adOpenKeyset打开键集
17、类型游标。其行为类似动态游标,不同的只是禁止查看其他用户添加的记录,并禁止访问其他用户删除的记录,其他用户所作的数据更改将依然可见。它始终支持书签,因此允许Recordset中各种类型的移动。adOpenDynamic打开动态类型游标。用于查看其他用户所作的添加、更改和删除,并用于不依赖书签的Recordset中各种类型的移动。如果提供者支持,可使用书签。adOpenStatic打开静态类型游标。提供记录集合的静态副本以查找数据或生成报告。它始终支持书签,因此允许Recordset中各种类型的移动。其他用户所作的添加、更改或删除将不可见。这是打开客户端(ADOR)Recordset对象时唯一允
18、许使用的游标类型。参数参数LockType可选。确定提供者打开Recordset时应该使用的锁定(并发)类型的LockTypeEnum值,可为下列常量之一。adLockReadOnly(默认值)只读不能改变数据。adLockPessimistic保守式锁定(逐个)提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录来完成。adLockOptimistic开放式锁定(逐个)提供者使用开放式锁定,只在调用Update方法时才锁定记录。adLockBatchOptimistic开放式批更新用于批更新模式(与立即更新模式相对)。参数参数Options可选,长整型长整型值,用于指示
19、提供者如何识别Source参数,如果在Source参数中传送的不是Command对象,那么可以使用Options参数优化Source参数的计算。如果没有定义Options则性能将会降低,原因是ADO必须调用提供者以确定参数为SQL语句、存储过程还是表名。如果确知所用的Source类型,则可以设置Options参数以指示ADO直接跳转到相关的代码。如果Options参数与Source类型不匹配,将产生错误。Options参数:adCmdText指示提供者应该将Source作为命令的文本定义来计算。adCmdTable指示ADO生成SQL查询以便从Source命名的表返回所有行。adCmdTabl
20、eDirect指示提供者更改从Source命名的表返回的所有行。adCmdStoredProc指示提供者应该将Source视为存储的过程。adCmdUnknown指示Source参数中的命令类型为未知。adCommandFile指示应从Source命名的文件中恢复持久(保存的)Recordset。adExecuteAsync指示应异步执行Source。adFetchAsync指示在提取CacheSize属性中指定的初始数量后,应该异步提取所有剩余的行。其他说明:如果不存在与记录集关联的连接,Options参数的默认值将为adCommandFile。这是持久Recordset对象的典型情况。如果
21、数据源没有返回记录,那么提供者将BOF和EOF属性同时设置为True,并且不定义当前记录位置。如果游标类型允许,仍然可以将新数据添加到该空Recordset对象。在结束对打开的Recordset对象的操作后,可使用Close方法释放所有关联的系统资源。关闭对象并非将它从内存中删除,可以更改它的属性设置并在以后使用Open方法再次将其打开。要将对象从内存中完全删除,可将对象变量设置为Nothing。在设置ActiveConnection属性之前调用不带参数的Open,可通过将字段追加到RecordsetFields集合创建Recordset的实例。(二)使用Recordset对象(续)其他方法常
22、用方法还包括:添加函数AddNew删除函数Delete修改函数Update我们主要都是直接使用SQL语句完成这些功能,而且他们的用法基本和前面讲过的一样,这里就不做详细介绍。(二)使用Recordset对象(续)对于部分提供者(例如MicrosoftODBCProviderforOLEDB连同MicrosoftSQLServer),可以通过使用Open方法传递连接字符串,根据以前定义的Connection对象独立地创建Recordset对象。ADO仍然创建Connection对象,但它不将该对象赋给对象变量。不过,如果正在相同的连接上打开多个Recordset对象,就应该显式创建和打开Conn
23、ection对象,由此将Connection对象赋给对象变量。如果在打开Recordset对象时没有使用该对象变量,即使在传递相同连接字符串的情况下,ADO也将为每个新的Recordset创建新的Connection对象。可以创建所需数量的Recordset对象。(二)使用Recordset对象(续)Recordset对象可支持两类更新:立即更新和批更新。使用立即更新,一旦调用Update方法,对数据的所有更改将被立即写入现行数据源。也可以将值的数组作为参数传递来使用AddNew和Update方法,同时更新记录的若干字段。如果提供者支持批更新,可以使提供者将多个记录的更改存入缓存,然后使用Up
24、dateBatch方法在单个调用中将它们传送给数据库。这种情况应用于使用AddNew、Update和Delete方法所做的更改。调用UpdateBatch方法后,可以使用Status属性检查任何数据冲突并加以解决。注意注意要执行不使用Command对象的查询,应将查询字符串传递给Recordset对象的Open方法。但是,在想要保持命令文本并重复执行或使用查询参数时,仍然需要Command对象。(三)使用Command对象ActiveConnection属性通过设置ActiveConnection属性使打开的连接与Command对象连接。CommandText属性定义命令(例如SQL语句)的可
25、执行文本。Execute方法执行在CommandText属性中指定的查询、或存储过程。如果CommandText属性指定按行返回查询,执行所产生的结果将存储在新的Recordset对象中。如果该命令不是按行返回查询,则返回关闭的Recordset对象。(三)使用Command对象可以使用Command对象的集合、方法、属性进行下列操作:使用CommandText属性定义命令(例如,SQL语句)的可执行文本。通过Parameter对象和Parameters集合定义参数化查询或存储过程参数。可使用Execute方法执行命令并在适当的时候返回Recordset对象。执行前应使用CommandType
26、属性指定命令类型以优化性能。使用Prepared属性决定提供者是否在执行前保存准备好(或编译好)的命令版本。使用CommandTimeout属性设置提供者等待命令执行的秒数。通过设置ActiveConnection属性使打开的连接与Command对象关联。设置Name属性将Command标识为与Connection对象关联的方法。将Command对象传送给Recordset的Source属性以便获取数据。使用Command对象查询数据库并返回Recordset对象中的记录,以便执行大量操作或处理数据库结构。取决于提供者的功能,某些Command集合、方法或属性被引用时可能会产生错误。(三)使用
27、Command对象如果不想使用Command对象执行查询,请将查询字符串传送给Connection对象的Execute方法或Recordset对象的Open方法。但是,当需要使命令文本具有持久性并重新执行它,或使用查询参数时,则必须使用Command对象。要独立于先前已定义的Connection对象创建Command对象,请将它的ActiveConnection属性设置为有效的连接字符串。ADO仍将创建Connection对象,但它不会将该对象赋给对象变量。但是,如果正在将多个Command对象与同一个连接关联,则必须显式创建并打开Connection对象,这样即可将Connection对象赋给对象变量。如果没有将Command对象的ActiveConnection属性设置为该对象变量,则即使使用相同的连接字符串,ADO也将为每个Command对象创建新的Connection对象。要执行Command,只需通过它所关联的Connection对象的Name属性,将其简单调用即可。必须将Command的ActiveConnection属性设置为Connection对象。如果Command带有参数,则将这些参数的值作为参数传送给方法。