Sql server 当SQL server数据库是本地数据库时,ADO客户端与服务器端游标之间的区别是什么?

Sql server 当SQL server数据库是本地数据库时,ADO客户端与服务器端游标之间的区别是什么?,sql-server,excel,vba,ado,Sql Server,Excel,Vba,Ado,我正在本地PC上使用SQLServerExpress存储数据库,并使用Excel/VBA中的ADO记录集进行连接 对记录集.CursorLocation属性使用adUseClientvsadUseServer有什么影响? 我发现的文档主要涉及服务器和客户端上资源可用性的优缺点,但这不是一个问题,因为服务器和客户端是同一个设备 这有点不完整-不仅仅是位置问题,还有类型问题。请参见,类型受位置限制。使用客户端游标,您可以拥有静态记录集1;对于客户端游标,请求密钥集或动态记录集是不合法的。仔细想想,这

我正在本地PC上使用SQLServerExpress存储数据库,并使用Excel/VBA中的ADO记录集进行连接

记录集.CursorLocation
属性使用
adUseClient
vs
adUseServer
有什么影响?


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

这有点不完整-不仅仅是位置问题,还有类型问题。请参见,类型受位置限制。使用客户端游标,您可以拥有静态记录集1;对于客户端游标,请求密钥集或动态记录集是不合法的。仔细想想,这是合乎逻辑的,因为服务器是拥有最新信息的服务器,所以它只能提供密钥集或动态记录集

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

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

使用服务器端密钥集记录集,从服务器返回的只是一个密钥链。当您在记录集中导航时,它必须向服务器请求您所使用的密钥的记录。因此,当你工作时,你的前期工作量会减少,但会有更多的闲聊

使用服务器端动态记录集(这是最罕见的——大多数提供程序都没有实现这一点——服务器能够通知客户机包括添加/删除在内的更改,但在其他方面它类似于keyset

简而言之,位置是不够的,你必须同时考虑位置和类型,这会影响你的代码库与服务器的“聊天”。p> 旁白--断开连接的记录集 有时“客户端”会与“断开连接”混淆。。。这实际上是另一回事,尽管断开连接的记录集必须是客户端记录集。毕竟,您如何能够在不丢失缓存的情况下“断开”连接?正如前面提到的,您仍然可以使用客户端静态记录集对数据执行更新;您只是不知道在打开时检索到数据后,服务器上的数据是否已更改。使用服务器端键集/动态键集,您可以在导航到该记录时立即检查数据是否已更改,而不是在打开客户端静态记录集之前检查数据是否已更改。因此,与服务器端记录集相比,客户端记录集遇到写入冲突的可能性更大,尤其是在使用该记录集浏览表单时

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

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


  • 根据:

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

  • 同一条:

    如果设置了不支持的值,则不会产生错误;将使用最接近的支持的游标类型

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

  • 发件人:

    如果
    CursorLocation
    属性设置为
    adUseClient
    ,则不支持
    adlock悲观设置。如果设置了不支持的值,则不会产生错误;将使用支持的最接近的
    锁类型


  • 将客户端游标称为“已断开连接”和服务器端游标称为“已连接”是否正确?更新了答案。