Я знаю, что существует способ получить список всех таблиц в базе данных Access при помощи quering MsysObjects:
SELECT MSysObjects.Name FROM MsysObjects
WHERE
Left$([Name],1)<>'~' AND
Left$([Name],4)<>'Msys' AND
MSysObjects.Type=1
Кто-либо знает подобное (или другой) способ получить список всех индексов в Базе данных Access MS?
Вы можете исследовать объекты TableDef
для доступа к именам индексов.
Public Sub ShowIndexNames()
Dim tdf As TableDef
Dim idx As Index
Dim num_indexes As Long
On Error GoTo ErrorHandler
For Each tdf In CurrentDb.TableDefs
num_indexes = tdf.Indexes.Count
If Left$(tdf.Name, 4) <> "MSys" Then
If num_indexes > 0 Then
For Each idx In tdf.Indexes
Debug.Print tdf.Name, idx.Name
Next idx
End If
End If
Next tdf
ExitHere:
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 3110
'Could not read definitions; no read definitions '
'permission for table or query '<Name>'. '
Debug.Print "No read definitions permission for " _
& tdf.Name
num_indexes = 0
Resume Next
Case Else
Debug.Print Err.Number & "-> " & Err.Description
GoTo ExitHere
End Select
End Sub
Edit: Пересмотрел под, чтобы игнорировать таблицы MSys* (система Access).
Вы также можете использовать метод ADO OpenSchema
для получения информации об индексах. В приведенном ниже коде перечислены имя индекса, связанная таблица и является ли индекс первичным ключом. Я написал его для использования позднего связывания для ADO, поскольку это не требует установки ссылки на Microsoft ActiveX Data Objects [version] Library.
Const adSchemaIndexes As Long = 12
Dim cn As Object ' ADODB.Connection
Dim rs As Object ' ADODB.Recordset
Dim i As Long
Set cn = CurrentProject.Connection
Set rs = cn.OpenSchema(adSchemaIndexes)
With rs
' enable next three lines to view all the recordset column names
' For i = 0 To (.Fields.Count - 1)
' Debug.Print .Fields(i).Name
' Next i
Do While Not .EOF
Debug.Print !TABLE_NAME, !INDEX_NAME, !PRIMARY_KEY
.MoveNext
Loop
.Close
End With
Set rs = Nothing
Set cn = Nothing
Если вы предпочитаете исследовать индексы для одной таблицы, а не для всех таблиц в базе данных, передайте имя таблицы в качестве пятого элемента массива.
Set rs = cn.OpenSchema(adSchemaIndexes, Array(Empty, Empty, Empty, Empty, "tblFoo"))