Access VBA:声明数据库对象的类型时出错:未定义用户定义的类型

fre*_*oft 5 database ms-access compiler-errors declaration ms-access-2010

在 Access 2010 VBA 中,如果我运行此子程序:

sub test

    Dim db
    Dim rst

    Set db = CurrentDb()
    Set rst = db.OpenRecordset("select * from mytable")

    Debug.Print "db:  " & TypeName(db)
    Debug.Print "rst: " & TypeName(rst)

end sub
Run Code Online (Sandbox Code Playgroud)

然后它显示(在“中间”面板中):

db:  Database
rst: Recordset2
Run Code Online (Sandbox Code Playgroud)

所以它可以工作,并且所有库都已正确安装(例如 ADO)。

好的,现在我想通过使用显示的类型(“Database”和“Recordset2”)显式声明变量类型,所以我以这种方式修改子:

sub test

    Dim db   as Database        ' explicitly
    Dim rst  as Recordset2      ' explicitly

    Set db = CurrentDb()
    Set rst = db.OpenRecordset("select * from mytable")

    Debug.Print "db:  " & TypeName(db)
    Debug.Print "rst: " & TypeName(rst)

end sub
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我在“Dim db as Database”行收到以下错误:

Compilation error:
User defined type is not defined
Run Code Online (Sandbox Code Playgroud)

所以我知道类型“Database”未定义(!)。为什么?

注:我也尝试过:

Dim db   as ADO.Database        ' explicitly
Dim rst  as ADO.Recordset2      ' explicitly
Run Code Online (Sandbox Code Playgroud)

和:

Dim db   as ADODB.Database      ' explicitly
Dim rst  as ADODB.Recordset2    ' explicitly
Run Code Online (Sandbox Code Playgroud)

和:

Dim db   as DAO.Database        ' explicitly
Dim rst  as DAO.Recordset2      ' explicitly
Run Code Online (Sandbox Code Playgroud)

并对所有这些人都犯了同样的错误。这怎么可能?如果我不声明类型,为什么它会起作用?


编辑:我刚刚发现 Access 还通过调用“CurrentProject.Connection”为当前数据库提供 ADODB.Connection 对象。所以我可以明确声明:

sub test

    Dim db As ADODB.Connection
    Set db = CurrentProject.Connection      ' Access gives an ADODB object too!

    Dim rst As ADODB.Recordset
    Set rst = New ADODB.Recordset
    rst.Open "select * from mytable", db

    Debug.Print "db:  " & TypeName(db)
    Debug.Print "rst: " & TypeName(rst)

end sub
Run Code Online (Sandbox Code Playgroud)

这表明:

db:  Connection
rst: Recordset
Run Code Online (Sandbox Code Playgroud)

所以我会使用它,因为 ADO 比 DAO 更现代。

4dm*_*ter 5

尝试检查“参考资料” - 您将看到没有 DAO 库。您的第一个示例有效,因为 db 具有 Variant 类型。以及作业

Set db = CurrentDb() 
Run Code Online (Sandbox Code Playgroud)

将 COM 对象 DAO.Database 放入 db 中,稍后 TypeName 确认这是数据库。如果你想使用

Dim db   as DAO.Database 
Run Code Online (Sandbox Code Playgroud)

您必须引用适当的库(例如 Microsoft DAO)

@John Shaw更新:现在您可以使用库“Microsoft Office 1 X .0 Access 数据库引擎对象库”作为“Microsoft DAO”的完全兼容替代品。