我正在尝试使用Excel VBA从Access 2007 ACCDB格式数据库中获取所有表的列表。
我关注过这篇文章:
How can I get table names from an MS Access Database?
使用:
SELECT MSysObjects.Name AS table_name
FROM MSysObjects
WHERE
(((Left([Name],1))<>"~")
AND ((Left([Name],4))<>"MSys")
AND ((MSysObjects.Type) In (1,4,6)))
order by MSysObjects.Name
但是我收到了这个错误。
记录无法读取;没有'MSysObjects'的读取权限
我希望能够仅使用SQL语句而不是OpenSchema
方法来获取表名。
我认为问题出在Access上。我不确定。
有人有任何想法吗?
答案 0 :(得分:9)
由于您的数据库是ACCDB格式,因此您将以用户 Admin 的身份工作。您可以在立即窗口中确认该点。 (用 Ctrl + g 去那里)
? CurrentUser()
Admin
由于 Admin 对SELECT
没有读取(MSysObjects
)权限,因此请执行DDL语句以向 Admin 授予该权限。< / p>
strDdl = "GRANT SELECT ON MSysObjects TO Admin;"
CurrentProject.Connection.Execute strDdl
答案 1 :(得分:3)
使用DAO tabledefs集合
Sub TableDefs()
Dim db As dao.Database
Dim tdfLoop As dao.TableDef
Set db = CurrentDb
With db
Debug.Print .TableDefs.Count & " TableDefs in " & .name
For Each tdfLoop In .TableDefs
Debug.Print " " & tdfLoop.name
Next tdfLoop
End With
End Sub
答案 2 :(得分:1)
它看起来像权限问题。尝试打开数据库并转到安全权限(在工具 - >安全 - &gt;用户和组权限下)确保您拥有数据库的管理员权限。
如果不这样做,则可能必须以执行并授予自己权限的用户身份登录数据库
答案 3 :(得分:1)
这对我有用,因为这是第一个提出这个问题的问题:
这是一个MDB文件。不了解别人。 我知道这不是问题所要求的。但是,StackOverflow问题/答案也被许多其他通过谷歌到达这里的人使用,就像我一样,我正在使用MDB。我希望这个答案对其他人有用。
打开MS Access GUI。没有它,没有弄明白如何做到这一点,对不起,虽然这很有可能。
转到工具...选项...
点击“查看”标签
选择“隐藏对象”,“系统对象”
关闭标签
转到工具...安全性..用户和组权限
选择所有表名,包括MSysObjects
点击所有“权限”复选框,以便为所有条目设置为“已选中”
根据需要申请/确认
答案 4 :(得分:0)
我能够使代码与MDB文件一起使用。我可以使用功能区上的“数据库工具 - 用户和权限”来设置用户权限。此选项仅适用于MDB文件。现在的问题是让它与ACCDB文件一起使用。
这是我的代码:
Dim DBFile As String
Dim Connection As ADODB.Connection
Dim Recordset As New ADODB.Recordset
DBFile = "C:\Documents and Settings\User\Desktop\Son.mdb"
Set Connection = New ADODB.Connection <br/>
Connection.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source= " & DBFile & ";"
SQLString = "SELECT MSysObjects.Name AS table_name" & _
"FROM MSysObjects WHERE (((Left([Name],1))<>" & """~""" & ")" & _
"AND ((Left([Name], 4))<>" & """MSys""" & ")" & _
"AND ((MSysObjects.Type) In (1,4,6)));order by MSysObjects.Name"
Set Recordset = New ADODB.Recordset
Recordset.Open SQLString, Connection
问题在于我无法使用ACCDB文件。