【问题标题】:How can I get table names from an MS Access Database?如何从 MS Access 数据库中获取表名?
【发布时间】:2010-09-17 02:35:46
【问题描述】:

Microsoft SQL Server 和 MySQL 有一个我可以查询的 INFORMATION_SCHEMA 表。但是它不存在于 MS Access 数据库中。

有没有我可以使用的等价物?

【问题讨论】:

    标签: ms-access


    【解决方案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
    

    【讨论】:

    • 仅适用于旧 Access 版本。
    • MsysObjects 是不受支持的系统表,不应使用。 MS Access 之外的这些表的权限可能非常有机会。
    【解决方案2】:

    设计为非常接近 SQL-92 INFORMATION_SCHEMA 的架构信息可以通过 OLE DB 提供程序为 Jet/ACE 引擎(我假设您的意思是“访问”)获得。

    见:

    OpenSchema Method (ADO)

    Supported Schema Rowsets

    【讨论】:

      【解决方案3】:

      您可以在 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

      【讨论】:

        【解决方案4】:

        要以 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 
        

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

        【讨论】:

        • 无法读取记录; 'MSysObjects' 没有读取权限。
        • 该 getSchema 文章已不存在。
        • 这个页面有好几个答案,为什么要退路呢?为什么是 c#?
        • 为什么 WayBack - 这就是我在链接的博客所有者擦除他的博客并重新启动它后找到原始内容的方式。为什么选择 C#?这就是博客所有者和编辑我帖子的人一年前选择做的事情。我只是在修复一个损坏的链接。
        • 你是对的...我刚刚测试了 hype8912 的编辑,他错了。它在 2007 年确实有效。已恢复!
        【解决方案5】:
        SELECT 
        Name 
        FROM 
        MSysObjects 
        WHERE 
        (Left([Name],1)<>"~") 
        AND (Left([Name],4) <> "MSys") 
        AND ([Type] In (1, 4, 6)) 
        ORDER BY 
        Name
        

        【讨论】:

        • MsysObjects 是不受支持的系统表,不应使用。 MS Access 之外的这些表的权限可能非常有机会
        【解决方案6】:

        这是使用数据访问对象 (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
        

        【讨论】:

          【解决方案7】:

          最好不要弄乱 msysObjects (恕我直言)。

          CurrentDB.TableDefs
          CurrentDB.QueryDefs
          CurrentProject.AllForms
          CurrentProject.AllReports
          CurrentProject.AllMacros
          

          【讨论】:

            【解决方案8】:

            我需要稍微修改 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。

            【讨论】:

              猜你喜欢
              • 2012-04-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多