我有一个列表框,其中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!
这种方法有多可靠?如果不是,有可靠的方法吗?
(我知道有关解决方法,例如将数据复制到临时表或创建值列表,但如果可能的话,我宁愿避免这种情况。)
答案 0 :(得分:2)
不是将表用作行源,而是创建查询并将查询的recordsettype属性设置为snapshot。然后,访问应该在一次调用中获取所有记录。
您还可以尝试在SQL Server中创建视图并包含NOLOCK提示或创建直通查询并在SQL中使用NOLOCK提示。
答案 1 :(得分:1)
我使用了这种方法(访问.ListCount
)以避免在列表框或具有大型Rowsource的组合框中出现以下行为:
并发现它非常可靠。
但除非你想避免为列表框创建额外的查询,AVG的解决方案听起来更清晰。
答案 2 :(得分:0)
使用(NOLOCK)在SQL Server上创建视图。然后链接到该视图并将其用作列表框的SQL源。
虽然您可以添加代码,采用记录集等,甚至强制列表框填充所有记录,但这种更改可能发生在典型应用程序中的100个位置。 (太多潜在的变化)。
使用NOLOCK的简单视图就足够了。
例如:
SELECT * FROM tblContaacts WITH (NOLOCK) order by LastName