在 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
然后它显示(在“中间”面板中):
db: Database
rst: Recordset2
所以它可以工作,并且所有库都已正确安装(例如 ADO)。
好的,现在我想通过使用显示的类型(“Database”和“Recordset2”)显式声明变量类型,所以我以这种方式修改 sub:
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
当我运行它时,在“Dim db as Database”行出现以下错误:
Compilation error:
User defined type is not defined
所以我明白“数据库”类型没有定义(!)。为什么?
注:我也试过:
Dim db as ADO.Database ' explicitly
Dim rst as ADO.Recordset2 ' explicitly
和:
Dim db as ADODB.Database ' explicitly
Dim rst as ADODB.Recordset2 ' explicitly
和:
Dim db as DAO.Database ' explicitly
Dim rst as DAO.Recordset2 ' explicitly
并且所有这些都出现了同样的错误。这怎么可能?如果我不声明类型,为什么它会起作用?
编辑:我刚刚发现 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
显示:
db: Connection
rst: Recordset
所以我会使用它,因为 ADO 比 DAO 更现代。
最佳答案
尝试检查“引用”——您会看到没有 DAO 库。 您的第一个示例有效,因为 db 具有 Variant 类型。和赋值
Set db = CurrentDb()
将 COM 对象 DAO.Database 放入 db,稍后 TypeName 确认这是数据库。 如果你想使用
Dim db as DAO.Database
您必须引用适当的库(例如 Microsoft DAO)
更新 @John Shaw : 现在您可以使用库“Microsoft Office 1X.0 Access 数据库引擎对象库”作为“Microsoft DAO”的完全兼容替代品。
关于database - Access VBA : Error when declaring the type of a Database object: User defined type is not defined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21989581/