有关ADO专题

原创 2003年06月09日 07:50:00

ADO架构图:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

               消费者          

              (Recordset)       提供者                           消费者        提供者           

    程应                   OLEDB   ←→    服务器件   ←→ OLEDB  ←→ 数据库

keyset CursorDynamic Cursor的执行过程:

1、 数据库只把记录的键值放入结果数据集中

2、 ADO Cursor Engine存取客户需要的记录

3、 OLE Provider再根据结果数据集中的键值字段到数据库中存取相应的数据

4、 根据键值找到的数据再放入结果数据集中

事务管理功能:

在使用ADO处理多个数据表的主从架构应用程序中,一定要记得激活事务管理的功能以保护更新的数据。

1、 激活事务管理功能:

Procedure ADODataSetBeforePost (Dataset: Dataset);

Begin

  If (not ADOConnection.InTransaction) then

ADOConnection.BeginTrans;

End;

2、 在数据成功更新之后确定事务:

Procedure ADODataSetAfterPost (Dataset: Dataset);

Begin

  If (ADOConnection.InTransaction) then

ADOConnection.CommitTrans;

End;

3、 最后,当更新数据发生错误时取消事务,以便正确释放系统资源:

Procedure ADODataSetPostError (Dataset: Dataset; E: EdatabaseError; var Action: TDataAction);

Begin

  ADOConnection.RollbackTrans;

        Action: =daAbort;

End;

RecordSet 的页面定位功能:例如 学生表中有1000笔数据,当页面的大小[PageSize]10笔数据时,那么整个数据表就被分割成100个不同的页面[PageCount]。因此程序员指定的页面号码[AbsolutePage]2,就可以存取到11-20笔的数据。

AbsolutePage:改变当前Page的位置,设定这个属性可以存取特定Page中的数据。这是个可擦写的属性。

       PageCount:数据表中所有的记录数除以PageSize后得到的页数。这是个只读属性。

       PageSize:指定没一个数据页中包含的数据笔数。这是个可擦写的属性。

RecordSet UpdateCriteria动态属性:

       AdCriteriaKey:只在SQL命令的Where子句中使用键值字段值来寻找原来的记录。

    AdCriteriaAllCols: 只在SQL命令的Where子句中使用所有字段值来寻找原来的记录。

AdCriteriaUpCols: SQL命令的Where子句中使用键值字段值以及所有被修改字段值来寻找原来的记录。这是ADO使用的默认的设定。

AdCriteriaTimeStamp: SQL命令的Where子句中使用键值字段值以及数据表中字段类型为TimeStamp的字段来寻找原来的记录。

何谓客户端Cursor、服务器端Cursor

       ADOCursorLocation分为两种:一种是客户端Cursor,另一种是服务器端Cursor

那么何谓CursorLocation呢?简单的说就是当客户端应用程序存取了一些数据之后,这些数据存储在什么地方?如果这些暂时的数据是存储在客户端的ADO驱动程序内存中,由客户端ADO引擎管理,这就称为客户端Cursor。相反,如果这些暂时的数据是存储在后端的数据库中,由后端数据库本身管理,就称为服务器端Cursor

       结论:使用Client-Side Cursor,再加上少量多次的存取方式,那么你的应用系统会非常有效率。

LockType对于数据存取行为的影响大于对ADO执行效率的影响。其主要影响数据源服务器如何锁定资源,以及锁定资源的数量。

ReadOnly:只读锁,在使用Locate方法搜寻数据时,使用ReadOnly类型的LockType执行效率最高。

Optimistic:乐观锁

BatchOptimistic:批处理锁

Pessimistic:悲观锁

       结论:在分布式多层应用系统或Internet/Intranet以及电子商务中,不要使用PessimisticLockType,因为这不但没有意义而且会损失执行效率。更严重的后果会造成系统死锁或发生数据不正确的情形。其次是在调用Locate方法搜寻数据时一般采用Client-Side CursorCacheSize的大小大约在100-1000之间、LockType采用OptimisticBatchOptimistic。以达到最佳效率。

CacheSize

1、 增加CacheSize可以增加ADO应用程序的执行效率,因为这可以减少网络的RoundTrips

2、 增加CacheSize也增加了启动数据表的时间,但增加ADO应用程序的执行效率。

3、 CacheSize接近1000时,ADO应用程序的执行效率在时间/空间比方面似乎是非常好的设定。

ExecuteOptions

       EoAsyncExecute:以异步的方式来执行命令。

       EoAsyncFetch:ADO存取了CacheSize指定的数据后,再以异步的方式存取其他的数据。

EoAsyncFetchNonBlocking:ADO以异步的方式执行命令,而且不会阻碍应用程序的执行。相对效率较高。

EoAsyncNoRecords:执行不会回传结果数据集的存储过程或命令。如果被执行的存储过程或命令回传的任何数据都会被丢弃。

结论:当ADO执行完Action Query之后,会以事件的方式通知客户端应用程序。

OnFetchProgress:以异步存取数据时,会定时触发这个事件处理程序。

OnFetchComplete:当异步存取的数据完全存取完毕后,会触发这个事件处理程序。

Prepared和存储过程:

       Prepared属性值会影响数据源在执行这些组件的Action Query时是否先编译这些SQL命令。如果Prepared属性值为True时,数据源只要编译一次即可重复执行这个存储过程。而不需要在没一次这些组件提出SQL命令时都编译一次SQL命令为存储过程,再执行。

排序数据:

ADO数据集.SORT:=’字名  排序,字名 排序……’    (排序有   ASC DESC)

ADO处理错误ERRORS(称错误集合对象)

……….PostError(..)….

  Var

Adoerrors:errors;

Adoerror:error;

Icount:integer;

Begin

   Adoerrors:=adoconn.errors;

   For icount:=0 to adoerrors.count-1 do

Begin

  Adoerror:=adoerrors.item[icount];

  Adoerror.number[source.description,helpfile.sqlstate];

End;

End;

…..

try…….except

   result:=false;

   raise;

ADO读取Excel的简单例子

一、简单说明: 工程名字ADO_Excel,类型是console app, 非empty有预编译头stdafx.h。 编译说明: 1.确保C盘下面路径有msado15.dll,没有安装office2...
  • Blues1021
  • Blues1021
  • 2015年02月04日 12:14
  • 6048

Windows下C++访问数据库(ADO)

C++利用ADO访问数据库还是比较方便的,我参考网上其它资料把ADO到一个类中,这样调用起来会更加的方便 这个类单线程访问数据库没有问题,提供了查询、增加、删除和修改的接口。 并行访问的话会有...
  • luke2834
  • luke2834
  • 2015年08月19日 12:07
  • 1824

【简书如何删除专题?】

简书如何删除专题 ? 步骤一:进入专题 步骤二:编辑专题 步骤三:保存更改 步骤四:刷新页面 步骤五:见证奇迹的时刻终...
  • M_agician
  • M_agician
  • 2017年05月22日 00:29
  • 2421

Delphi下的原生ADO使用方法

本文向您揭示在Delphi中使用ADO是如何轻而易举,结合了ADO的Delphi应用程序,将不再依赖于BDE。 ADO的精髓在于利用简单的COM指令来快速方便的访问ODBC数据源,微软的表格、...
  • Hmillet
  • Hmillet
  • 2016年03月30日 09:55
  • 2428

ODBC、OLEDB和ADO之间的关系

学习了.net视频之后,对里面涉及到的数据库连接部分中的一些概念
  • wangyy130
  • wangyy130
  • 2014年05月26日 19:45
  • 1780

用ADO操作数据库的方法步骤

学习ADO时总结的一些经验     用ADO操作数据库的方法步骤   ADO接口简介 ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr...
  • gongluck93
  • gongluck93
  • 2016年09月19日 10:33
  • 2697

ADO和ADO.NET的区别

ADO.NET是ADO的后继版本,主要目的是在.NET Framework中更容易地创建分布式、 数据共享的应用程序,它提供了一个数据访问接口,以便和OLE DB数据源进行通信,如 SQL S...
  • ZHOUCHAOQIANG
  • ZHOUCHAOQIANG
  • 2014年04月30日 10:11
  • 4132

C++使用ADO2数据库类查询、添加、修改、删除操作

在工程中添加ado2.h、ado2.cpp两个文件 如果项目之前在XP在编译,在换到WINDOWS7编译时可能会出错,这是因为msado15.dll和MSJRO.DLL版本的问题。 XP ...
  • bingo1191683228
  • bingo1191683228
  • 2015年05月05日 16:08
  • 1117

【VBA研究】使用ADO组件的两种方式----引用法和创建法

作者:iamlaosong 1、引用法      引用ADO相关组件:打开VBA编辑器,在菜单中点选“工具”--》“引用”。确保“Microsoft ActiviteX Data Objects 2....
  • iamlaosong
  • iamlaosong
  • 2015年04月17日 14:27
  • 2907

64位程序,利用ADO连接Oracle数据库

刚好手头项目解决了ADO连接Oracle数据库的问题,z
  • sisyphus_zhou
  • sisyphus_zhou
  • 2014年09月29日 16:14
  • 6638
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:有关ADO专题
举报原因:
原因补充:

(最多只允许输入30个字)