访问和链接表到 SQL 服务器 - 在布局视图中编辑数据导致事务和锁定表
Access and Linked Tables to SQL Server - edit data in layout view results in transaction and locked tables
我正在使用 Access 2013 和 Sql Server 2012。我已使用链接 table 将访问应用程序升级到 Sql 服务器。我有一个 Access 查询(不在 SQL 服务器上)提供了大约 4 table 秒的结果。然后我将其显示在绑定 layout/table 视图中,其中每一行对应于结果查询中的一行。
在布局视图中,用户可以编辑任意行的数据。一旦用户进行了编辑,Access 显然会打开一个事务并保持打开状态。只要用户在 editable 布局视图中,作为查询一部分的 tables 就会被锁定。如果另一台计算机上的另一个用户正在使用 Access,则他们无法编辑任何 table(通过任何方法,而不仅仅是相同的布局视图)。第二个用户将在他们的应用程序中暂停 30 秒,然后最终会出现错误...
ODBC-update on a linked table 'TableName' failed.
[Microsoft][ODBC Sql Server DRiver]Query timeout expired (#0)
一旦第一个用户退出布局视图,所有内容将再次打开供其他用户编辑。
有什么办法可以控制交易吗?也许只是让它更新一行,然后释放事务。
可能必须将布局视图的数据源更改为 SQL 服务器存储过程或视图,并且不允许在 table 中进行编辑。相反,如果用户想要连续更改某些内容,则单击以调出一个编辑表单。寻找其他选择。
您有几个可能的解决方案。
一种解决方案是使用 where 子句打开有问题的表单,从而只打开一行,而不是很多行。
如果所讨论的表格不是连续表格,以上只是实用的建议。
所以你去:
strInvoice = inputbox("What invoice to work on")
docmd.Openform "frmInvoice",,,"[invoiceNum] = " & strInvoice
因此,假设发票列上有索引,将表格限制在一行即可解决此问题。而且这样的设计往往对用户更友好。我在这里解释这个重要的搜索概念:
http://www.kallal.ca/Search/index.html
另一种解决此问题的方法是强制用所有记录填充表单(从性能的角度来看,这确实是一个坏主意,即使没有 SQL 服务器在没有任何类型的情况下启动表单从用户的角度以及从性能的角度来看,我上面显示的 where 子句是一个坏主意)..
经常出现 table 锁定的原因是表单开始从 SQL 服务器提取数据,但随后 Access 说嘿,等等,我有足够的数据——但是在 SQL 上开始的查询=] 服务器已经触发了一些 table 锁,并假设所有行都将返回给客户端(因此客户端停止记录流才是真正导致您锁定的原因)。因此,您可以采取的措施来防止出现此问题,最后执行一个移动以拉取所有记录,从而消除(释放)table 锁。
所以在表单加载事件中,你可以去:
me.recordset.MoveLast
me.recordset.MoveFirst
如前所述,这里的问题是将所有记录拉入一个表单首先是一个非常糟糕的设计。
最后一点:
另一种消除 table 锁的方法是将查询构建为视图 SQL 服务器端并包含 NOLOCK 提示。然后,您为视图设置一个 link,并且表单不是基于本地查询,而是基于视图的表单。由于视图具有 NOLOCK 提示,因此您不需要上述 movelast/movefirst 建议。
因此,在此处的几种解决方案中,将表单打开为一条记录确实是推荐的解决方案。我的意思是,当您走到即时取款机前时,它不会下载每个帐户,然后询问您要使用哪个帐户。当您使用 google 等搜索引擎时,它不会下载整个互联网,然后询问您要搜索什么。连公交站台的老太太都能看出来,更何况是写软件的!
因此,当您在 Access 中设计 + 构建表单时,将 table 中的所有记录下载到表单中然后让用户搜索的意义不大。因此,在加载表单之前,需要提示用户要处理的内容,如果在打开表单时使用 where 子句,即使表单绑定到大型 linked table 到SQL 服务器只有匹配 where 子句的记录才会被下拉到该表单中。
如果您不使用 where 子句,那么如前所述,锁定问题将会浮出水面。
作为临时修复,尝试加载表单中的 movelast/movefirst,因为这应该可以解决锁定问题。但是从长远来看,我建议使用 where 子句,或者考虑视图想法。
请注意,如果您有任何组合框基于 4 个 table 中的任何一个,那么您会再次发现锁定问题,因为组合框将请求数据(和 SQL 服务器位置table 锁定)。然后 AGAIN Access 将告诉 sql 服务器请停止加载组合框,因为还不需要所有行(但为时已晚,因为 table 锁定已经发生)。
因此,如果您根据使用的任何 table 在该表单中有任何组合框,那么您会再次发现 table 锁定。在这些情况下,我会再次建议将组合框基于带有 NO LOCK 提示的直通查询,或者再次带有 no-lock 提示的视图。
因此,请检查基于任何这些 table 的任何组合框的表单 - 它们也会导致 table 锁定。
我正在使用 Access 2013 和 Sql Server 2012。我已使用链接 table 将访问应用程序升级到 Sql 服务器。我有一个 Access 查询(不在 SQL 服务器上)提供了大约 4 table 秒的结果。然后我将其显示在绑定 layout/table 视图中,其中每一行对应于结果查询中的一行。
在布局视图中,用户可以编辑任意行的数据。一旦用户进行了编辑,Access 显然会打开一个事务并保持打开状态。只要用户在 editable 布局视图中,作为查询一部分的 tables 就会被锁定。如果另一台计算机上的另一个用户正在使用 Access,则他们无法编辑任何 table(通过任何方法,而不仅仅是相同的布局视图)。第二个用户将在他们的应用程序中暂停 30 秒,然后最终会出现错误...
ODBC-update on a linked table 'TableName' failed.
[Microsoft][ODBC Sql Server DRiver]Query timeout expired (#0)
一旦第一个用户退出布局视图,所有内容将再次打开供其他用户编辑。
有什么办法可以控制交易吗?也许只是让它更新一行,然后释放事务。
可能必须将布局视图的数据源更改为 SQL 服务器存储过程或视图,并且不允许在 table 中进行编辑。相反,如果用户想要连续更改某些内容,则单击以调出一个编辑表单。寻找其他选择。
您有几个可能的解决方案。
一种解决方案是使用 where 子句打开有问题的表单,从而只打开一行,而不是很多行。
如果所讨论的表格不是连续表格,以上只是实用的建议。
所以你去:
strInvoice = inputbox("What invoice to work on")
docmd.Openform "frmInvoice",,,"[invoiceNum] = " & strInvoice
因此,假设发票列上有索引,将表格限制在一行即可解决此问题。而且这样的设计往往对用户更友好。我在这里解释这个重要的搜索概念:
http://www.kallal.ca/Search/index.html
另一种解决此问题的方法是强制用所有记录填充表单(从性能的角度来看,这确实是一个坏主意,即使没有 SQL 服务器在没有任何类型的情况下启动表单从用户的角度以及从性能的角度来看,我上面显示的 where 子句是一个坏主意)..
经常出现 table 锁定的原因是表单开始从 SQL 服务器提取数据,但随后 Access 说嘿,等等,我有足够的数据——但是在 SQL 上开始的查询=] 服务器已经触发了一些 table 锁,并假设所有行都将返回给客户端(因此客户端停止记录流才是真正导致您锁定的原因)。因此,您可以采取的措施来防止出现此问题,最后执行一个移动以拉取所有记录,从而消除(释放)table 锁。
所以在表单加载事件中,你可以去:
me.recordset.MoveLast
me.recordset.MoveFirst
如前所述,这里的问题是将所有记录拉入一个表单首先是一个非常糟糕的设计。
最后一点:
另一种消除 table 锁的方法是将查询构建为视图 SQL 服务器端并包含 NOLOCK 提示。然后,您为视图设置一个 link,并且表单不是基于本地查询,而是基于视图的表单。由于视图具有 NOLOCK 提示,因此您不需要上述 movelast/movefirst 建议。
因此,在此处的几种解决方案中,将表单打开为一条记录确实是推荐的解决方案。我的意思是,当您走到即时取款机前时,它不会下载每个帐户,然后询问您要使用哪个帐户。当您使用 google 等搜索引擎时,它不会下载整个互联网,然后询问您要搜索什么。连公交站台的老太太都能看出来,更何况是写软件的!
因此,当您在 Access 中设计 + 构建表单时,将 table 中的所有记录下载到表单中然后让用户搜索的意义不大。因此,在加载表单之前,需要提示用户要处理的内容,如果在打开表单时使用 where 子句,即使表单绑定到大型 linked table 到SQL 服务器只有匹配 where 子句的记录才会被下拉到该表单中。
如果您不使用 where 子句,那么如前所述,锁定问题将会浮出水面。
作为临时修复,尝试加载表单中的 movelast/movefirst,因为这应该可以解决锁定问题。但是从长远来看,我建议使用 where 子句,或者考虑视图想法。
请注意,如果您有任何组合框基于 4 个 table 中的任何一个,那么您会再次发现锁定问题,因为组合框将请求数据(和 SQL 服务器位置table 锁定)。然后 AGAIN Access 将告诉 sql 服务器请停止加载组合框,因为还不需要所有行(但为时已晚,因为 table 锁定已经发生)。
因此,如果您根据使用的任何 table 在该表单中有任何组合框,那么您会再次发现 table 锁定。在这些情况下,我会再次建议将组合框基于带有 NO LOCK 提示的直通查询,或者再次带有 no-lock 提示的视图。
因此,请检查基于任何这些 table 的任何组合框的表单 - 它们也会导致 table 锁定。