强制MS Access检索所有ListBox行并释放锁定

时间:2015-12-14 10:54:03

标签: sql-server vba ms-access listbox locking

我有一个列表框,其中RowSource绑定到附加的SQL Server表。如果表很大,Access不会加载完整的结果集,而是创建服务器端游标并“按需”加载数据,因为列表框向下滚动。这是一个很好的功能,因为它允许列表框和组合框快速显示结果。

但是,这会在表上创建一个共享锁,即,在具有列表框的用户完全向下滚动并释放锁之前,没有其他用户可以插入新行。这是known problem

为了避免此问题,我想强制 Access将所有行加载到内存中。通过反复试验,我发现访问ListCount属性似乎就是这样做了:

myListBox.RowSource = "myTable"

' There are now shared locks on the table in SQL Server:
'
' ResourceType ObjectName IndexName           RequestMode
' -------------------------------------------------------
' OBJECT       myTable                        IS
' KEY          myTable    PK__myTable__17C... S
' PAGE         myTable    PK__myTable__17C... IS

someDummyVariable = myListBox.ListCount

' The locks are now gone!

这种方法有多可靠?如果不是,有可靠的方法吗?

(我知道有关解决方法,例如将数据复制到临时表或创建值列表,但如果可能的话,我宁愿避免这种情况。)

3 个答案:

答案 0 :(得分:2)

不是将表用作行源,而是创建查询并将查询的recordsettype属性设置为snapshot。然后,访问应该在一次调用中获取所有记录。

您还可以尝试在SQL Server中创建视图并包含NOLOCK提示或创建直通查询并在SQL中使用NOLOCK提示。

答案 1 :(得分:1)

我使用了这种方法(访问.ListCount)以避免在列表框或具有大型Rowsource的组合框中出现以下行为:

  • Access加载行的第一部分
  • 用户想滚动到最后
  • Access加载更多记录,滚动条跳转
  • 用户必须再次滚动
  • 等。等等,直到最后所有行都已加载

并发现它非常可靠。

但除非你想避免为列表框创建额外的查询,AVG的解决方案听起来更清晰。

答案 2 :(得分:0)

使用(NOLOCK)在SQL Server上创建视图。然后链接到该视图并将其用作列表框的SQL源。

虽然您可以添加代码,采用记录集等,甚至强制列表框填充所有记录,但这种更改可能发生在典型应用程序中的100个位置。 (太多潜在的变化)。

使用NOLOCK的简单视图就足够了。

例如:

SELECT * FROM tblContaacts WITH (NOLOCK) order by LastName