1

我有一个具有“连续表单”子表单的 Microsoft Access 应用程序。在我的应用程序中访问该表单时,我发现 SQL Server 有“很多”锁(超过 1000 个)。[通过从主数据库视图 sys.dm_trans_locks 中选择 1000 条记录找到]。

表单的数据源是一个名为 qryProspect 摘要的传递查询。反过来,它只有 SQL“EXEC qryProspectSummary”来调用返回所需数据的存储过程。

存储过程“qryProspectSummary”只是一个复杂的选择语句 - 有一些嵌套的选择和联合以及多个表的连接。从 SQL Server Management Studio 运行它会产生正确的结果,并且不会锁定数据库的任何部分。

我已将数据源记录集类型设置为“快照”。

我怎样才能防止 Access 取出所有这些锁 - 它有效地破坏了任何为应该只是数据快照而工作的多用户。

4

2 回答 2

1

您可能希望使用链接视图来返回此快照的结果。我发现在某些情况下,在处理来自 SQL Server 的大型数据集时,Access 使用视图要好得多。有什么方法可以使用qryProspectSummary作为视图?这不能保证有效,但这是我会尝试的一种选择。

于 2012-11-08T16:42:13.520 回答
1

我昨天找到了问题的答案,但由于某种原因无法访问此站点。我没有创建一个可以访问存储过程的直通查询,而是将以下代码添加到表单的 ON LOAD 事件中。

Dim cmd As ADODB.Command, rst As ADODB.Recordset
Set cmd = New ADODB.Command
cmd.ActiveConnection = getStrConn
cmd.CommandText = "qryProspectSummary"
cmd.CommandType = adCmdStoredProc
Set rst = cmd.Execute()
Set Me.Form.Recordset = rst
Set cmd = Nothing

getStrConn 是一个重试数据库连接字符串的函数(我有一个管理功能可以在启动时更改数据库,所以我不能硬编码它)。这解决了问题,当我打开表单时,我发现现在没有什么异常被锁定。

它确实有一个缺点,我使用的是 Form.Requery,但这不会重新运行查询 - 我必须重新执行上面的代码。但这是一个很小的代价

于 2012-11-09T06:27:23.097 回答