我正在本地PC上使用SQLServer EXPRESS来容纳数据库并与来自Excel / VBA的ADO记录集连接。
为adUseClient
属性使用adUseServer
与recordset.CursorLocation
有什么含义?
我发现的文档主要涉及服务器与客户端之间资源可用性的优缺点,但这在这里不是问题,因为服务器与客户端是同一设备。
答案 0 :(得分:1)
这有点不完整-不仅与位置有关,而且与类型有关。请参阅,类型受位置限制。使用客户端游标,您可以具有静态记录集 1 ;要求使用客户端游标的键集或动态记录集是不合法的。考虑一下这是合乎逻辑的,因为服务器是拥有最新信息的服务器,因此它只能是提供键集或动态记录集的服务器。
请注意,关于ADO的一方面是,如果您要求输入无效的组合,就不会出错。而是,它将以无提示的方式将您的“请求”替换为提供者可以提供服务的有效请求。 2 因此,您无法相信自己的请求已经兑现,直到您真正打开记录集为止。打开后,您会注意到类型/位置/锁可能与您要求的不同。
使用客户端静态记录集,基本上意味着服务器可以为您提供一大块数据。当您四处浏览时,为了保持数据为最新状态,与服务器之间没有进一步的通信。您仍然可以与它交谈以进行更新或重新同步,但顾名思义,它是由客户端驱动的。
使用服务器端密钥集记录集,您从服务器获得的所有信息都是一串密钥。当您浏览记录集时,它将不得不向服务器询问您所使用的键的记录。因此,您的工作量较少,但工作时会进行更多的闲聊。
使用服务器端动态记录集(这是最罕见的-大多数提供程序都没有实现)-服务器能够通知客户端有关更改(包括添加/删除)的信息,但是它类似于键集。
因此,简而言之,位置是不够的-您必须同时考虑位置和类型,这会影响代码库与服务器之间的“闲谈”。
有时“客户端”与“断开连接”混合在一起……这实际上是另一回事,尽管断开连接的记录集必须是客户端记录集。毕竟,如何在不丢失缓存的情况下“断开连接”?如前所述,您仍然可以使用客户端静态记录集对数据执行更新。您只是不知道服务器上的数据是否已更改,因为在打开时已检索到数据。使用服务器端键集/动态键,您可以在导航到该记录后立即检查数据是否已更改,而不是在客户端静态记录集打开时更早地检查。因此,与服务器端记录集相比,与客户端记录集发生写冲突的机会更大,尤其是当您使用记录集浏览表单时。
断开记录集的连接仅意味着在记录集上执行Update
并且服务器不保持同步时,没有通信发生。但是,您可以选择重新连接并批量提交更改。
请注意,LockType
也受位置 3 的影响。逻辑上,客户端记录集永远不会对它们的锁定感到悲观,因为要悲观,您需要对此有独占控制权,只有服务器才能提供。
如果CursorLocation属性设置为adUseClient,则仅支持adOpenStatic设置。
来自同一篇文章:
如果设置了不支持的值,则不会导致错误;将使用最接近的受支持CursorType。
如果提供程序不支持所请求的游标类型,则它可能会返回另一种游标类型。当Recordset对象打开时,CursorType属性将更改为与使用中的实际光标类型匹配。
如果
adLockPessimistic
属性设置为CursorLocation
,则不支持adUseClient
设置。如果设置了不支持的值,则不会导致错误;会使用最近的受支持的LockType
。