我有一个列表框,其中的 RowSource 绑定(bind)到附加的 SQL Server 表。如果表很大,Access 不会加载完整的结果集,而是创建服务器端游标并在列表框向下滚动时“按需”加载数据。这是一个很好的功能,因为它允许列表框和组合框快速显示结果。
但是,这会在表上创建共享锁,即,在使用列表框的用户一直向下滚动并释放锁之前,其他用户都无法插入新行。这是known problem .
为了避免这个问题,我想强制 Access 将所有行加载到内存中。通过反复试验,我发现 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!
这种方法的可靠性如何?如果不行,有可靠的方法吗?
(我知道一些解决方法,例如将数据复制到临时表或创建值列表,但如果可能的话,我宁愿避免这种情况。)
最佳答案
不要使用表作为行源,而是创建一个查询并将查询的 recordsettype 属性设置为快照。然后,Access 应通过一次调用获取所有记录。
您还可以尝试在 SQL Server 中创建 View 并包含 NOLOCK 提示,或者创建直通查询并在 SQL 中使用 NOLOCK 提示。
关于sql-server - 强制 MS Access 检索所有列表框行并释放锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34265202/