【问题标题】:Difference between ADO client-side vs server-side cursor when the SQL Server database is local?SQL Server 数据库在本地时,ADO 客户端与服务器端游标的区别?
【发布时间】:2019-05-08 09:44:37
【问题描述】:

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

recordset.CursorLocation 属性使用adUseClientadUseServer 有何影响?

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

【问题讨论】:

    标签: sql-server excel vba ado


    【解决方案1】:

    这有点不完整 - 这不仅与位置有关,还与类型有关。看,类型受位置限制。使用客户端游标,您可以拥有静态记录集1;对于客户端游标,请求键集或动态记录集是不合法的。当您考虑它时,这是合乎逻辑的,因为服务器是拥有最新信息的服务器,因此它只能是提供密钥集或动态记录集的服务器。

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

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

    使用服务器端密钥集记录集,您从服务器返回的只是一串密钥。当您浏览记录集时,它必须向服务器询问您所在键的记录。因此,在您工作时,前期工作量会减少,但对话会更多。

    使用服务器端动态记录集,这是最罕见的——大多数提供商没有实现——服务器能够通知客户端有关更改,包括添加/删除,但除此之外它类似于键集。

    因此,简而言之,位置是不够的 - 您必须同时考虑位置和类型,这会影响您的代码库与服务器的“聊天”程度。

    Aside -- 断开连接的记录集

    有时“客户端”与“断开连接”混为一谈……这实际上是另一回事,尽管断开连接的记录集必然是客户端记录集。毕竟,你怎么可能在不丢失缓存的情况下“断开连接”呢?如前所述,您仍然可以使用客户端静态记录集对数据执行更新;您只是不知道自从您在打开时检索数据以来服务器上的数据是否已更改。使用服务器端键集/动态,您可以在导航到该记录后立即检查数据是否已更改,而不是在打开客户端静态记录集时更早。因此,与服务器端记录集相比,与客户端记录集发生写入冲突的可能性更大,尤其是当您使用记录集浏览表单时。

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

    请注意,LockType 也受位置3 的影响。客户端记录集在锁定时永远不能悲观是合乎逻辑的,因为要悲观,您需要对其进行排他控制,并且只有服务器可以提供。


    1. CursorType doc

      如果 CursorLocation 属性设置为 adUseClient,则仅支持 adOpenStatic 设置。

    2. 来自同一篇文章:

      如果设置了不支持的值,则不会产生错误;将使用最接近的受支持的 CursorType。

      如果提供者不支持请求的游标类型,它可能会返回另一种游标类型。当 Recordset 对象打开时,CursorType 属性将更改以匹配实际使用的游标类型。

    3. 来自LockType property article

      如果CursorLocation 属性设置为adUseClient,则不支持adLockPessimistic 设置。如果设置了不支持的值,则不会产生错误;将使用最接近的受支持的LockType

    【讨论】:

    • 将客户端游标称为“断开连接”而将服务器端游标称为“连接”是否正确?
    • 更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2017-09-19
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多