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 更现代。
尝试检查“参考资料” - 您将看到没有 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”的完全兼容替代品。