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

时间:2019-05-08 09:44:38

标签: sql-server excel vba ado

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

adUseClient属性使用adUseServerrecordset.CursorLocation有什么含义?

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

1 个答案:

答案 0 :(得分:1)

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

请注意,关于ADO的一方面是,如果您要求输入无效的组合,就不会出错。而是,它将以无提示的方式将您的“请求”替换为提供者可以提供服务的有效请求。 2 因此,您无法相信自己的请求已经兑现,直到您真正打开记录集为止。打开后,您会注意到类型/位置/锁可能与您要求的不同。

使用客户端静态记录集,基本上意味着服务器可以为您提供一大块数据。当您四处浏览时,为了保持数据为最新状态,与服务器之间没有进一步的通信。您仍然可以与它交谈以进行更新或重新同步,但顾名思义,它是由客户端驱动的。

使用服务器端密钥集记录集,您从服务器获得的所有信息都是一串密钥。当您浏览记录集时,它将不得不向服务器询问您所使用的键的记录。因此,您的工作量较少,但工作时会进行更多的闲聊。

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

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

在旁边-断开记录集

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

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

请注意,LockType也受位置 3 的影响。逻辑上,客户端记录集永远不会对它们的锁定感到悲观,因为要悲观,您需要对此有独占控制权,只有服务器才能提供。


  1. 根据CursorType doc

      

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

  2. 来自同一篇文章:

      

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

         

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

  3. 来自LockType property article

      

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