当前位置:编程学习 > Delphi >>

Delphi数据库编程新手指南(10)

 我们已经了解了如何使用几个数据访问组件来连接Access数据库并检索数据。有一项可以肯定:ADOExpress组件非常适用于基于ADO数据访问和元数据对象映射。

ADO的核心是记录集对象(Recordset)。 Recordset对象(又称为DataSet数据集)是查询命令执行后的结果(例如,TADOQuery组件的SELECT语句)。当一个基于ADO的应用程序从数据库中检索行,ADO Recordset对象将该数据的数据内容和可进行的操作进行了封装。 ADO使用游标来保持一个记录集行中所包含的逻辑,同时也提供该记录集中的当前位置。在开发中,我们使用游标来创建一个记录集的滚动式浏览(向前或向后),或者使该记录集获取其他用户所进行的更改。

游标(Cursor)?!

最简单的定义应该是:一个启用了浏览功能并且已知当前行位置的查询结果集。

在ADO中,游标具有三大功能。首先,游标类型(cursor type)确定游标的运动方式,以及记录集是否反映出用户进行的更改;其次,游标位置确定游标打开时存储记录集的位置;最后,游标的锁定类型(locking type)指定如何锁定ADO数据存储的行——当你想进行更改时。

对游标的了解是极为重要的。例如,为了得到记录集做想做的事,我们需要使用某些特定类型的游标来打开ADO记录集。例如,RecordCount属性不支持只进游标。

在ADOExpress集中,TCustomADODataSet封装了一组属性、事件及方法,用于通过ADO数据存储进行数据访问。所有的TCustomADODataSet派生类(TADOTable、TADODataSet、TADOQuery和TADOStoredProc)具有一些共同的属性。使用CursorType、CursorLocation和LockType属性,创建最有效的记录集。

游标类型(CursorType)

  游标类型的选择,直接影响你的应用程序是否成功。 ADO提供了四个游标选项:动态(dynamic)、键集(keyset)、只向前(forward-only)和静态(static)。由于它们不同的行为表现,对每一种游标类型功能的了解将会使你极大受益。

CursorType属性指定如何遍历记录集以及检索记录集后对数据库所做的更改是否可见。Delphi用TCursorType对ADO游标类型进行了封装。

ctDynamic

允许你查看其他用户对该数据集进行的添加、删除和更改;允许所有不依赖于书签的遍历方式;允许书签——如果数据库提供商支持。ADODataset的Supports方法可以验证一个记录集是否支持某些特定的操作。例如检查是否支持书签:


[delphi] 
if ADOTable1.Supports(coBookmark)  then ... 

if ADOTable1.Supports(coBookmark)  then ...
如果多个用户可能同时对数据库中的行进行插入、更新和删除操作,那么选择动态游标。

ctKeyset

类似动态游标,区别在于它会阻止你浏览其他用户新增的记录;并阻止你访问其他用户已删除的记录。而由其他用户进行的数据更改仍是可见的。始终支持书签,因此允许所有类型的遍历方式。

ctStatic

提供一组用于查找数据或生成报表的记录集静态拷贝(副本);始终支持书签,因此允许所有类型的遍历方式;其他用户进行的添加、更改或删除将无法看到。其类似于从一个BDE查询组件(RequestLive属设置为False)得到的结果集。

ctForward-only

除了只能向前滚动浏览来遍历记录集,其他特性与动态游标完全相同。在只需遍历一次数据集的情况下,能大幅提高性能。

 

注:当ADO数据集组件的CursorLocation属性设为clUseClient时,只支持ctStatic模式。

注:如果请求的游标类型供应商不支持,将会返回另一种。也就是说,在CursorLocation置为clUseServer时若将CursorType置为ctDynamic,在Access数据库中,Delphi会将CursorType置为 ctKeyset。

CursorLocation

CursorLocation属性定义记录集被打开时的创建位置 —— 客户端或服务器。

一个客户端游标中的数据与数据库是“先天断开”的。 ADO检索选择性查询语句的返回结果(所有行)时,在你开始使用它之前已经将数据复制到客户端(ADO游标中)。在你对记录进行更改后,ADO会将这些更改转换为查询指令并通过OLE DB供应商将其提交到你的数据库中。客户端游标的行为方式类似于本地缓存。

在多数情况下首选客户端游标,因为其滚动和更新速度更快并且更有效,虽然向客户端返回数据会增加网络负载。

使用服务器端游标意味着只获取需要的相应记录;用户浏览数据时将会对服务器进行更多的请求;在插入、更新或删除记录时更为高效;某些情况下比客户端游标提供更好的性能——尤其是在网络通信量过大是个问题的情况下。

选择游标类型时需要考虑的因素:你是否正在做更多的数据更新,还是仅仅检索数据;使用ADO的应用程序是基于本地还是互联网;结果集的大小;数据存储以及环境等等因素。其他因素也可能会限制你,例如,MS Access不支持动态游标而使用键集;一些数据提供商自动匹配CursorType和CursorLocation的属性;以及其他错误,当你使用不受支持的CursorType或CursorLocation类型。

LockType

LockType属性告诉供应商在记录处于编辑状态时应当放何种类型的锁。锁,可以防止用户读取正在被其他用户修改的数据,并且防止用户修改其他用户正在修改的数据。

在Access数据库中修改记录时,相邻记录也将被锁定——因为Access使用的是页面锁定策略。这意味着,如果用户编辑记录时,其他一些用户将不会被允许修改该记录,甚至不能修改其之前或之后的一些记录。

Delphi中,TADOLockType指定可以使用的锁的类型。你可以通过设置相应的光标锁定选项控制行和页锁定。要使用特定的锁定方案,提供商和数据库类型必须支持该锁定方案。

ltOptimistic

Optimistic锁,只在记录有物理更新时进行锁定。该类型的锁定常用于以下情况:在游标被打开并最终执行某行更新的这段间隔时间中,有很小的几率,第二个用户也对该行进行了更新操作。当前行中的值将会与最后获取该行时检索到的值进行比较。

ltPessimistic

Pessimistic锁,记录处于编辑状态时将被锁定。该选项告诉ADO得到记录行的独占锁,当用户对该记录中的任何列进行任何变动时。ADOExpress组件不直接支持Pessimistic记录锁,因为ADO本身不具备任何方式来锁定给定的记录,同时仍然支持导航到其他记录。

ltReadOnly

只读锁,不允许数据编辑。常用于以下情况:应用程序必须暂时防止数据被更改,但读取不受限制。只读锁定并将CursorType设置为ctForwardOnly,是制作报表的理想选择。

ltBatchOptimistic

BatchOptimistic锁,用于断开连接的记录集。记录集先在本地进行更新,而后将所有的修改在一个批处理中发送回数据库。

 

补充:软件开发 , Delphi ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,