你有几个可能的解决方案。
一种解决方案是使用 where 子句打开有问题的表单,以便仅打开一行,而不是多行。
如果所讨论的形式不是连续形式,上述只是实用建议。
所以你去:
strInvoice = inputbox("What invoice to work on")
docmd.Openform "frmInvoice",,,"[invoiceNum] = " & strInvoice
因此,假设发票列上有索引,将表单限制为一行将解决此问题。而且这样的设计往往更加用户友好。我在这里解释这个重要的搜索概念:
http://www.kallal.ca/Search/index.html
解决此问题的另一种方法是用所有记录强制填充表单(从性能的角度来看,这确实是一个坏主意,即使没有 SQL 服务器启动一个没有任何类型的 where 子句的表单,如我上面所示从用户的角度来看的想法,也从性能的角度来看)..
表锁经常发生的原因是表单开始从 SQL Server 中提取数据,但是 Access 说“嘿,等等我有足够的数据”——但是在 SQL Server 上启动的查询已经触发了一些表锁,并假设所有行都将被返回到客户端(因此客户端停止记录流才是真正导致您锁定的原因)。因此,为了防止此问题,您可以执行最后一个移动以提取所有记录,从而消除(释放)表锁。
所以在表单加载事件中,你可以去:
me.recordset.MoveLast
me.recordset.MoveFirst
如前所述,这里的问题是,将所有记录拉入表单首先是一个非常糟糕的设计。
最后一点:
消除表锁的另一种方法是将查询构建为视图 SQL 服务器端并包含 NOLOCK 提示。然后,您设置了一个指向视图的链接,并且表单不是基于本地查询,而是基于视图。由于视图具有 NOLOCK 提示,因此您不需要上述 movelast/movefirst 建议。
因此,在这里的几种解决方案中,将表单打开到 ONE 记录确实是推荐的解决方案。我的意思是,当您走到即时取款机前时,它不会下载每个帐户,然后询问您要使用哪个帐户。当您使用谷歌等搜索引擎时,它不会下载整个互联网,然后询问您要搜索什么。就算是公交车站的老太太也能看出来,更别说写软件了!
因此,当您在 Access 中设计 + 构建表单时,将表中的所有记录下载到表单中然后让用户搜索几乎没有意义。因此,需要在加载表单之前提示用户要处理的内容,并且如果在打开表单时使用 where 子句,即使表单绑定到 SQL 服务器的大型链接表,也只有记录匹配 where 子句将被下拉到该表单中。
如果您不使用 where 子句,那么如前所述,锁定问题将抬头。
作为临时修复,请尝试加载表单中的 movelast/movefirst,因为这应该可以解决锁定问题。但是从长远来看,我建议使用 where 子句,或者考虑视图的想法。
请注意,如果您有基于 4 个表中的任何一个的任何组合框,那么您会再次发现锁定问题,因为组合框将请求数据(并且 SQL 服务器在该请求期间放置表锁定)。然后 AGAIN Access 将告诉 sql server 请停止加载组合框,因为还不需要所有行(但为时已晚,因为发生了表锁定)。
因此,如果您有基于所使用的任何表的任何组合框,那么您会再次发现表锁发生。在这些情况下,我再次建议将组合框基于带有 NO LOCK 提示的直通查询,或再次基于带有无锁提示的视图。
因此,请检查基于任何这些表的任何组合框的表单——它们也会导致表锁定。