web-dev-qa-db-fra.com

Comment puis-je obtenir les noms de table d'une base de données MS Access?

Microsoft SQL Server et MySQL ont une table INFORMATION_SCHEMA que je peux interroger. Cependant, il n'existe pas dans une base de données MS Access.

Y a-t-il un équivalent que je peux utiliser?

29
luntain

Pour construire sur la réponse d'Ilya, essayez la requête suivante:

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 

(celui-ci fonctionne sans modification avec un MDB)

Les utilisateurs d’ACCDB peuvent avoir besoin de faire quelque chose comme ça

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 

Comme il y a une table supplémentaire est inclus qui semble être une table système de quelque sorte.

56
BIBD

Vous pouvez utiliser des schémas dans 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

De: http://msdn.Microsoft.com/en-us/library/aa165325(office.10).aspx

9
Fionnuala

Voici une réponse mise à jour qui fonctionne dans Access 2010 VBA à l'aide de DAO (Data Access Objects). Le nom de la table est contenu dans TableDef.Name. La collection de toutes les définitions de table est conservée dans TableDefs. Voici un exemple rapide de boucle dans les noms de table:

Dim db as Database
Dim td as TableDef
Set db = CurrentDb()
For Each td In db.TableDefs
  YourSubTakingTableName(td.Name)
Next td
5
Pete

Des informations de schéma conçues pour être très proches de celles de SQL_92 INFORMATION_SCHEMA peuvent être obtenues pour le moteur Jet/ACE (c'est ce que je veux dire par accès) via les fournisseurs de base de données OLE. 

Voir:

Méthode OpenSchema (ADO)

Ensembles de lignes de schéma pris en charge

2
onedaywhen

Obtenir une liste de tables:

SELECT 
    Table_Name = Name, 
FROM 
    MSysObjects 
WHERE 
    (Left([Name],1)<>"~") 
    AND (Left([Name],4) <> "MSys") 
    AND ([Type] In (1, 4, 6)) 
ORDER BY 
    Name
1
Ilya Kochetov
SELECT 
Name 
FROM 
MSysObjects 
WHERE 
(Left([Name],1)<>"~") 
AND (Left([Name],4) <> "MSys") 
AND ([Type] In (1, 4, 6)) 
ORDER BY 
Name
0
Syed Daud

Mieux vaut ne pas jouer avec msysObjects (IMHO).

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