Как я могу получить имена таблиц из базы данных MS Access? - PullRequest
30 голосов
/ 14 октября 2008

Microsoft SQL Server и MySQL имеют таблицу INFORMATION_SCHEMA, которую я могу запросить. Однако он не существует в базе данных MS Access.

Есть ли эквивалент, который я могу использовать?

Ответы [ 7 ]

57 голосов
/ 14 октября 2008

Чтобы построить ответ Ильи, попробуйте следующий запрос:

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 

Поскольку имеется дополнительная таблица, которая выглядит как системная таблица.

9 голосов
/ 14 октября 2008

Вы можете использовать схемы в 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

5 голосов
/ 13 апреля 2012

Вот обновленный ответ, который работает в Access 2010 VBA с использованием объектов доступа к данным (DAO). Имя таблицы хранится в 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 голосов
/ 14 октября 2008

Информация о схеме, которая разработана так, чтобы быть очень близкой к информации SQL-92 INFORMATION_SCHEMA, может быть получена для механизма Jet / ACE (что, как я предполагаю, вы подразумеваете под «доступом») через поставщиков OLE DB.

См:

Метод OpenSchema (ADO)

Поддерживаемые наборы строк схемы

1 голос
/ 14 октября 2008

Получение списка таблиц:

SELECT 
    Table_Name = Name, 
FROM 
    MSysObjects 
WHERE 
    (Left([Name],1)<>"~") 
    AND (Left([Name],4) <> "MSys") 
    AND ([Type] In (1, 4, 6)) 
ORDER BY 
    Name
0 голосов
/ 18 апреля 2017

Лучше не связываться с msysObjects (IMHO).

CurrentDB.TableDefs
CurrentDB.QueryDefs
CurrentProject.AllForms
CurrentProject.AllReports
CurrentProject.AllMacros
0 голосов
/ 11 октября 2011
SELECT 
Name 
FROM 
MSysObjects 
WHERE 
(Left([Name],1)<>"~") 
AND (Left([Name],4) <> "MSys") 
AND ([Type] In (1, 4, 6)) 
ORDER BY 
Name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...