Microsoft SQL Server и MySQL имеют таблицу INFORMATION_SCHEMA, которую я могу запросить. Однако он не существует в базе данных MS Access.
Можно ли использовать эквивалент?
Microsoft SQL Server и MySQL имеют таблицу INFORMATION_SCHEMA, которую я могу запросить. Однако он не существует в базе данных MS Access.
Можно ли использовать эквивалент?
Чтобы построить на 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
Так как добавлена дополнительная таблица, которая, как представляется, представляет собой системную таблицу некоторого типа.
Вы можете использовать схемы в 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
Вот обновленный ответ, который работает в 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
Информация о схеме, которая была бы очень близка к информации о SQL-92 INFORMATION_SCHEMA, может быть получена для двигателя Jet/ACE (что я подразумеваю под "доступом" ) через поставщиков OLE DB.
См:
Получение списка таблиц:
SELECT
Table_Name = Name,
FROM
MSysObjects
WHERE
(Left([Name],1)<>"~")
AND (Left([Name],4) <> "MSys")
AND ([Type] In (1, 4, 6))
ORDER BY
Name
SELECT
Name
FROM
MSysObjects
WHERE
(Left([Name],1)<>"~")
AND (Left([Name],4) <> "MSys")
AND ([Type] In (1, 4, 6))
ORDER BY
Name
Лучше не вмешиваться в msysObjects (IMHO).
CurrentDB.TableDefs
CurrentDB.QueryDefs
CurrentProject.AllForms
CurrentProject.AllReports
CurrentProject.AllMacros