sql-server - 强制 MS Access 检索所有列表框行并释放锁定

标签 sql-server vba ms-access listbox locking

我有一个列表框,其中的 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/

相关文章:

sql-server - MS-SQL 存储过程的历史记录

sql - 如何创建特定大小的 SQL Server 地理多边形?

SQL Server - 如何管理表中的分层数据?

vba - 将相同的方法应用于多个对象

vba - 删除用户表单中动态创建的文本框的问题

excel - VBA Excel获取表格的最后一个 child

sql-server - 无 DSN 连接 MS Access 前端和 SQL 服务器后端

python - 在pyodbc中执行SELECT查询时,ODBC MS Access驱动程序出现“超出系统资源”错误

sql - 根据另一个表从一个表中删除

c# - 在 C# 中将 Access 图像 OLE 对象转换为原始图像字节数组