我有一个具有"连续式"子形式的Microsoft Access应用程序。在我的应用程序中访问该表格时,我发现SQL Server具有"很多"锁(超过1000个)。[通过从主数据库查看SYS.DM_TRANS_LOCKS进行选择1000个记录。
该表单的数据源是通过查询,称为Qryprospect摘要。反过来,它只有SQL" Exec QryProspectsummary"调用存储过程,该过程返回所需的数据。
存储的过程" Qryprospectsummary"只是一个复杂的选择语句 - 一些嵌套的选择和工会,并在几个表上加入。从SQL Server Management Studio运行它会产生正确的结果,并且不会锁定数据库的任何部分。
我将数据量记录集类型设置为"快照"。
我如何防止访问所有这些锁 - 它有效地摧毁了任何用于数据快照的多用户。
您可能需要使用链接视图来返回此快照的结果。在某些情况下,我发现访问在处理SQL Server的大型数据集时,访问使用的视图更好。有什么办法可以使用 QryProspectsummary 作为视图?这不能保证工作,但我会尝试的一种选择。
我昨天找到了我问题的答案,但由于某种原因无法访问此网站。我不是在访问存储过程的情况下创建传递查询,而是将以下代码添加到表单的ON加载事件中。
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是一个函数,它可以重新验证数据库连接字符串(我有一个admin功能可以更改启动数据库,因此我不能只是硬码)。这解决了问题,我发现当我打开表格时,现在没有什么与众不同的了。
它确实有一个缺点,我正在使用form.requery,但这并没有重新运行查询 - 我必须重新执行上述代码。但这是一个很小的代价