【发布时间】:2022-02-05 10:35:59
【问题描述】:
在 StackOverflow[1、2、3、4] 上多次讨论了 Access 错误“无法打开更多数据库。”。 Bytes.com 上还有一个有趣的discussion of the error,其中 Allen Brown 和 David Fenton 权衡了可能导致错误的原因,并争论其背后的限制是否与连接或表句柄有关。据我所知,这些地方的原因或解决方案都不适用于我的情况。
我有一个运行良好的复杂数据库,但随后开始抛出此错误。我已将 VBA 代码和数据结构归结为以下基本内容:
Option Explicit
Public Function TestFunction(ID_test_1 As Integer, nID_test_2 As Integer) As Variant
Dim oCurDb_Ftn As DAO.Database, oTestData As DAO.Recordset, sSQL As String, vTestCode As Variant
Set oCurDb_Ftn = CurrentDb()
sSQL = "SELECT * FROM t_test_2 WHERE ID_test_2 = " & nID_test_2 & ";"
Set oTestData = oCurDb_Ftn.OpenRecordset(sSQL)
vTestCode = oTestData![bValue]
oTestData.Close
Set oTestData = Nothing
Set oCurDb_Ftn = Nothing
TestFunction = vTestCode
End Function ' TestFunction
表格中的数字是任意的。字段ID_test_n 是主键。上面的代码就是TestModule的全部内容。查询TestQuery 是:
SELECT t_test_1.ID_test_1, TestFunction(ID_test_1,3) AS [Test code]
FROM t_test_1;
打开查询时,乍一看似乎没问题。但是如果我向下滚动它,它会抛出“无法再打开”错误:
我发现了一种可以消除错误的方法。如果我去掉函数TestFunction()的第一个参数,那么它的定义就变成了:
Public Function TestFunction(nID_test_2 As Integer) As Variant
...
查询中对它的调用就变成了:
TestFunction(3)
然后我可以在查询表中上下滚动多次而不会出错。这些更改是可能的,因为在函数的基本代码中,没有对ID_test_1 的引用。但是在实际的数据库中,传递该参数是有原因的,而忽略它不是一种选择。尽管如此,如果没有传递该参数,导致错误的任何原因都不会发生,这对我来说很神秘。
谁能看到这里发生了什么,为什么我会收到这个错误,以及如何在不排除函数参数的情况下修复它?
环境:Windows 10 Pro 64 位,Access 2019。
【问题讨论】:
-
我没有查看您的代码,但我遵循了此视频中的建议,并设法通过我今天运行的代码避免了这个问题:youtu.be/zPC0dhgVYeg
标签: vba ms-access runtime-error