0

我正在使用 Access 2013 和 Sql Server 2012。我已使用链接表将访问应用程序升级为 Sql Server。我有一个 Access 查询(不在 SQL 服务器上),它提供了大约 4 个表的结果。然后,我将其显示在绑定的布局/表格视图中,其中每一行对应于结果查询中的一行。

在布局视图中,用户可以编辑任意行中的数据。一旦用户进行编辑,显然 Access 会打开一个事务并使其保持打开状态。只要用户处于可编辑布局视图中,作为查询一部分的表就会被锁定。如果另一台计算机上的其他用户正在使用 Access,则他们无法编辑任何表格(通过任何方法,而不仅仅是相同的布局视图)。第二个用户将在他们的应用程序中暂停 30 秒,然后最终会出现错误......

ODBC-update on a linked table 'TableName' failed.
[Microsoft][ODBC Sql Server DRiver]Query timeout expired (#0)

一旦第一个用户退出布局视图,那么所有内容都会再次打开以供其他用户编辑。

有没有办法控制交易?也许只是让它更新一行,然后释放事务。

可能必须将布局视图的数据源更改为 SQL Server Sproc 或视图,并且不允许在表中进行编辑。相反,如果用户想要连续更改某些内容,则单击以显示编辑表单。寻找其他选择。

4

1 回答 1

1

你有几个可能的解决方案。

一种解决方案是使用 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 提示的直通查询,或再次基于带有无锁提示的视图。

因此,请检查基于任何这些表的任何组合框的表单——它们也会导致表锁定。

于 2015-09-13T23:08:03.427 回答