Получите список индексов в базе данных Access

Я знаю, что существует способ получить список всех таблиц в базе данных Access при помощи quering MsysObjects:

SELECT MSysObjects.Name FROM MsysObjects
WHERE
  Left$([Name],1)<>'~' AND
  Left$([Name],4)<>'Msys' AND
  MSysObjects.Type=1

Кто-либо знает подобное (или другой) способ получить список всех индексов в Базе данных Access MS?

5
задан waanders 10 April 2013 в 15:50
поделиться

1 ответ

Вы можете исследовать объекты 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"))
5
ответ дан 13 December 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: