SQL 服务器数据库为本地时,ADO 客户端游标与服务器端游标之间的区别?

Difference between ADO client-side vs server-side cursor when the SQL Server database is local?

我在本地 PC 上使用 SQLServer EXPRESS 来存放数据库并连接来自 Excel/VBA 的 ADO 记录集。

adUseClientadUseServerrecordset.CursorLocation 属性 有何影响?

我发现的文档主要涉及服务器与客户端资源可用性的优缺点,但这在这里不是问题,因为服务器和客户端是同一台设备。

这有点不完整 - 这不仅与位置有关,还与类型有关。看,类型受位置限制。使用 client-side 游标,您可以拥有静态记录集1;使用 client-side 游标要求键集或动态记录集是不合法的。仔细想想,这是合乎逻辑的,因为服务器是拥有最新信息的服务器,所以它可以只是提供键集或动态记录集的服务器。

请注意,关于 ADO 的一个方面是,如果您请求无效组合,您不会收到错误。相反,它会默默地将您的 "requests" 替换为提供商可以提供的有效请求。2 因此,在您实际打开之前,您不能相信您的请求已得到满足记录集。打开后,您会注意到 type/location/lock 可能与您要求的不同。

使用 client-side 静态记录集,基本上意味着服务器为您提供一大块数据。当您四处浏览时,不会为了保持数据最新而与服务器进行进一步的通信。您仍然可以出于更新或重新同步的目的与其对话,但顾名思义,这是由客户端驱动的。

使用 server-side 键集记录集,您从服务器返回的只是一串键。当您浏览记录集时,它必须向服务器请求您所在键的记录。因此,前期工作量较少,但工作时会进行更多闲聊。

使用 server-side 动态记录集,这是最罕见的 -- 大多数提供程序都没有实现 -- 服务器能够通知客户端有关更改的信息,包括 additions/deletions,但否则它是类似于键集。

简而言之,位置是不够的 - 您必须同时考虑位置和类型,这会影响 "chatty" 您的代码库与服务器的关系。

旁白 -- 断开连接的记录集

有时 "client-side" 会与 "disconnected" 混淆...这实际上是另一回事,尽管断开连接的记录集必然是 client-side 记录集。毕竟,你怎么可能 "disconnect" 不丢失缓存呢?如前所述,您仍然可以使用 client-side 静态记录集对数据执行更新;您只是不知道自从您在打开时检索数据以来服务器上的数据是否已更改。使用 server-side keyset/dynamic,您可以在导航到该记录时立即检查数据是否已更改,而不是更早地在 client-side 静态记录集打开时检查。因此,与 server-side 记录集相比,client-side 记录集遇到写入冲突的可能性更大,尤其是当您使用记录集浏览表单时。

断开记录集仅意味着当您在记录集上执行 Update 时没有通信发生,并且服务器未保持同步。但是,您可以选择 re-connecting 并批量提交更改。

请注意 LockType 也受到位置 3 的影响。合乎逻辑的是,client-side 记录集在锁定时永远不会悲观,因为要悲观,您需要对其进行独占控制,并且只有服务器才能提供。


  1. 根据CursorType doc

    Only a setting of adOpenStatic is supported if the CursorLocation property is set to adUseClient.

  2. 来自同一篇文章:

    If an unsupported value is set, then no error will result; the closest supported CursorType will be used instead.

    If a provider does not support the requested cursor type, it may return another cursor type. The CursorType property will change to match the actual cursor type in use when the Recordset object is open.

  3. 来自 LockType property article:

    The adLockPessimistic setting is not supported if the CursorLocation property is set to adUseClient. If an unsupported value is set, then no error will result; the closest supported LockType will be used instead.