SQL 游标(摘抄自MS官网文档)

每个游标使用临时资源来保存其数据。 这些资源可以是内存、 磁盘分页文件、 临时磁盘文件或甚至临时存储在数据库中。 游标被称为客户端游标时这些资源都位于客户端计算机上。 游标被称为服务器端游标时这些资源位于服务器上。

客户端游标
在 ADO 中,调用的客户端游标通过使用adUseClient CursorLocationEnum。 与非键集客户端游标,服务器将发送整个结果集在网络上客户端计算机。 客户端计算机提供和管理所需的游标和结果集的临时资源。 客户端应用程序可以浏览整个结果集以确定所需的行。

如果它们包含过多的行,静态和由键集驱动的客户端游标可能会在工作站上放置大量负载。 虽然都能够构建有数千行的游标的游标库,用于提取此类大的行集的应用程序可能会很差。 有例外情况,当然。 对于某些应用程序,大的客户端游标可能是完全适合,性能可能不会出现问题。

客户端游标的一个明显的好处是快速响应。 结果集已下载到客户端计算机后,浏览的所有行都都非常快。 你的应用程序是通常更具可伸缩性与客户端游标,因为游标的资源要求放置在每个单独的客户端,而不是服务器上。

服务器端游标
在 ADO 中,对于服务器端游标通过使用调用adUseServer CursorLocationEnum。 与服务器端游标,服务器将管理结果集使用提供的服务器计算机资源。 服务器端游标通过网络返回请求的数据。 此类型的游标有时可以提供更好的性能比客户端游标,尤其是在情况下,过多的网络流量时出现问题。

但是,务必要指出的服务器端游标-至少暂时-对于每个活动的客户端占用宝贵的服务器资源。 你必须相应地规划以确保你的服务器硬件能够管理所有的活动客户端请求的服务器端游标。 此外,因为它提供了只将单个行的访问权限-有可用的任何批处理游标,服务器端游标可以是缓慢。

服务器端游标是插入、 更新或删除记录时很有用。 对于服务器端游标,可以在同一连接上有多个活动语句。

游标类型

只进游标

典型的默认游标类型,称为只进 (或非可滚动) 游标中,可以仅向前移动的结果集。 只进游标不支持滚动 (向前和向后移动结果集中的功能);它仅支持从一开始的行提取到结果集的末尾。 与某些只进游标 (如与 SQL Server 游标库),则所有 insert、 update 和 delete 语句所做的当前用户 (或由其他用户提交) 在结果集中的影响行是可见的因为在提取行。 因为不能向后滚动游标,但是,提取该行后对数据库中的行所做的更改不会通过游标可见。

当前行的数据处理后,只进游标释放的资源,用来存放该数据。 只进游标是动态的默认值,这意味着处理的当前行时检测到的所有更改。 这提供了更快地打开游标,并启用结果集以显示对基础表所做的更新。

虽然只进游标不支持向后滚动,您的应用程序可以返回到结果集关闭并重新打开游标的开头。 这是使用较少的数据的有效方法。 或者,你的应用程序无法读取结果集一次、 缓存数据保存在本地,,然后浏览本地数据缓存。

如果你的应用程序不需要滚动浏览结果集,只进游标是开销的使用最小快速检索数据的最佳方式。 使用adOpenForwardOnly CursorTypeEnum以指示你想要使用在 ADO 中的只进游标。

静态游标

静态游标始终会显示结果集与第一次打开游标时一样。 具体取决于实现,静态游标是只读或读/写,并提供向前和向后滚动。 静态游标通常不会检测到的成员身份、 顺序或值的结果集打开游标后所做的更改。 静态游标可能检测其自己的更新、 删除和插入,尽管不需要它们来执行此操作。

静态游标永远不会检测其他更新、 删除和插入。 例如,假定静态游标提取行和另一个应用程序,然后更新该行。 如果应用程序提取此行从静态游标,它看到的值保持不变,尽管其他应用程序所做的更改。 支持所有类型的滚动,但提供程序可能会或可能不支持书签。

如果你的应用程序并不需要检测数据更改,并需要滚动,静态游标是最佳选择。 使用adOpenStatic CursorTypeEnum以指示你想要使用静态游标在 ADO 中。

键集游标

键集游标提供静态和动态游标之间的功能的功能,以检测更改。 如静态游标,它不会不始终检测到更改的成员身份和顺序的结果集。 类似动态游标,它检测到的行值发生更改的结果集中。

由键集驱动的游标控制的一组称为键集的唯一标识符 (键)。 键是根据以唯一方式标识结果集中各行的一组列生成的。 由键集是从返回的查询语句的所有行的键值的组。

使用由键集驱动的游标,密钥生成和保存游标中的每一行并存储客户端工作站或服务器上。 在访问每个行时,存储的密钥可用来从数据源提取当前数据值。 在由键集驱动的游标,结果集的成员身份被冻结时已完全填充由键集。 此后,添加内容或更新会影响成员身份不是结果集之前重新打开它的一部分。

因为在用户滚动浏览结果集,会显示为 (使其通过由键集所有者或其他进程) 的数据值的更改。 (由其他进程) 游标外部所做的插入是可见的仅当关闭并重新打开游标。 从游标内部进行的插入是结果集的末尾可见。

如果由键集驱动游标试图来检索已删除的行,行显示为一个"hole"的结果集中。 行的键存在于由键集,但在结果集中不存在的行。 如果更新某一行中的密钥值,则将该行视为已删除和然后插入,因此这样的行也将显示为结果集中的孔。 由键集驱动游标始终可以检测到其他进程中删除的行,尽管它可以选择删除它将自身删除的行的键。 执行此操作的由键集驱动游标无法检测到自己的删除,因为已删除的证据。

对键列的更新与删除旧密钥后再插入新项的操作。 新键值不是不通过游标进行更新时可见的。 如果通过游标进行更新,新密钥值是结果集的末尾可见。

没有名为由键集驱动标准游标键集驱动游标的变体。 由键集驱动的标准光标,在结果集中的行的成员身份和行的顺序固定的游标打开时,但对值由游标所有者所做的更改和其他进程提交的更改是可见。 如果更改将使成员身份的行,或者会影响行的顺序,行不会消失或移动,除非关闭并重新打开游标。 插入的数据未显示,但对现有数据的更改并出现和在提取行。

由键集驱动游标很难正确使用数据的更改敏感度取决于许多不同的情况下,因为如上文所述。 但是,如果你的应用程序不关心并发更新,可以以编程方式处理错误的键,并且必须直接访问某些键的行,由键集驱动游标可能适用于您。 使用adOpenKeyset CursorTypeEnum以指示你想要使用在 ADO 中的键集游标。

动态游标

动态游标检测结果集中,而不考虑是否发生的更改从内部游标或游标以外的其他用户的行所做的所有更改。 所有的 insert、 update 和 delete 语句所做的所有用户都通过游标可见。 动态游标可以检测到的行、 顺序和中的结果集打开游标后的值所做的任何更改。 游标外部所做的更新不可见,直到提交 (除非游标事务隔离级别设置为"未提交")。

例如,假设动态游标提取两个行和另一个应用程序,然后更新这些行之一和删除其他。 如果动态游标然后提取这些行,它将找不到已删除的行,但它将显示已更新的行的新值。

动态游标是一个不错的选择,如果你的应用程序必须检测到其他用户所做的所有并发更新。 使用adOpenDynamic CursorTypeEnum以指示你想要使用动态游标在 ADO 中。

猜你喜欢

转载自blog.csdn.net/qq_31729917/article/details/86606063