如何从MS Access数据库获取表名?

39

Microsoft SQL Server和MySQL有一个我可以查询的INFORMATION_SCHEMA表。然而,在MS Access数据库中不存在该表。

是否有等价物可供使用?

8个回答

61

基于Ilya的答案,尝试使用以下查询:

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 

(此代码可以在MDB中不做修改地使用)

ACCDB用户可能需要执行以下操作:

SELECT MSysObjects.Name AS table_name
FROM MSysObjects
WHERE (((Left([Name],1))<>"~") 
        AND ((Left([Name],4))<>"MSys") 
        AND ((MSysObjects.Type) In (1,4,6))
        AND ((MSysObjects.Flags)=0))
order by MSysObjects.Name 

由于包含了一个额外的表,它似乎是某种系统表。


27
记录无法读取;在“MSysObjects”上没有读取权限。 - Ian Boyd
那篇关于getSchema的文章已经不存在了。 - Warren P
这个页面上有几个答案,为什么要回溯?为什么是C#? - Fionnuala
为什么使用WayBack?因为在博客所有者删除并重新启动链接后,我可以找到原始内容。为什么选择c#?那是博客所有者和编辑去年选择的。我只是在修复一个错误的链接。 - BIBD
你是对的...我刚刚测试了hype8912的编辑,他错了。它在2007年确实可以工作。已还原! - BIBD
@PauAI - 对我来说似乎可以。虽然似乎包含了一个额外的系统表,但我已经更新了答案并修复了这个问题。 - BIBD

11

在Access中,您可以使用模式。

Sub ListAccessTables2(strDBPath)
   Dim cnnDB As ADODB.Connection
   Dim rstList As ADODB.Recordset

   Set cnnDB = New ADODB.Connection

   ' Open the connection.
   With cnnDB
      .Provider = "Microsoft.Jet.OLEDB.4.0"
      .Open strDBPath
   End With

   ' Open the tables schema rowset.
   Set rstList = cnnDB.OpenSchema(adSchemaTables)

   ' Loop through the results and print the
   ' names and types in the Immediate pane.
   With rstList
      Do While Not .EOF
         If .Fields("TABLE_TYPE") <> "VIEW" Then
            Debug.Print .Fields("TABLE_NAME") & vbTab & _
               .Fields("TABLE_TYPE")
         End If
         .MoveNext
      Loop
   End With
   cnnDB.Close
   Set cnnDB = Nothing
End Sub

来源: http://msdn.microsoft.com/en-us/library/aa165325(office.10).aspx


8

这是一个更新的答案,使用数据访问对象(DAO)在Access 2010 VBA中运行。表名存储在TableDef.Name中。所有表定义的集合存储在TableDefs中。以下是循环遍历表名的快速示例:

Dim db as Database
Dim td as TableDef
Set db = CurrentDb()
For Each td In db.TableDefs
  YourSubTakingTableName(td.Name)
Next td

2
设计得非常接近于 SQL-92 INFORMATION_SCHEMA 的模式信息可以通过 OLE DB 提供程序获取 Jet/ACE 引擎的模式信息(我假设你所说的是“access”)。

请参见:

OpenSchema 方法 (ADO)

支持的模式行集


1
获取表列表:
SELECT 
    Table_Name = Name, 
FROM 
    MSysObjects 
WHERE 
    (Left([Name],1)<>"~") 
    AND (Left([Name],4) <> "MSys") 
    AND ([Type] In (1, 4, 6)) 
ORDER BY 
    Name

1
仅适用于旧版Access。 - Warren P
MsysObjects是不支持的系统表,不应使用。在MS Access之外对这些表的权限可能非常不确定。 - Fionnuala

0
SELECT 
Name 
FROM 
MSysObjects 
WHERE 
(Left([Name],1)<>"~") 
AND (Left([Name],4) <> "MSys") 
AND ([Type] In (1, 4, 6)) 
ORDER BY 
Name

1
MsysObjects是不支持的系统表,不应使用。在MS Access之外对这些表的权限可能非常不确定。 - Fionnuala

0

我需要稍微修改BIBD发布的SQL(需要在from子句中添加sys.到MSysObjects以完全限定表名)。

        String sqlString = "";
        sqlString += "SELECT MSysObjects.Name AS table_name \n";
        sqlString += "FROM sys.MSysObjects \n";
        sqlString += "WHERE (((Left([Name],1))<>\"~\")  \n";
        sqlString += "        AND ((Left([Name],4))<>\"MSys\")  \n";
        sqlString += "        AND ((MSysObjects.Type) In (1,4,6)) \n";
        sqlString += "        AND ((MSysObjects.Flags)=0)) \n";
        sqlString += "order by MSysObjects.Name \n";

一个完整的工作示例可以在https://github.com/NACHC-CAD/access-to-csv-tool找到。该示例还展示了如何使用jdbc连接到MS Access数据库,并使用Apache Commons CSV将所有表导出为csv。

0
最好不要动 msysObjects(个人意见)。
CurrentDB.TableDefs
CurrentDB.QueryDefs
CurrentProject.AllForms
CurrentProject.AllReports
CurrentProject.AllMacros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接