IV. OpenSchema▲
Comme je l'ai dit plus avant, il faut utiliser plutôt la méthode OpenSchema de l'objet Connection ADO pour récupérer des informations de structure. Cette méthode est de la forme suivante: Set recordset = connection. OpenSchema (QueryType, Criteria, SchemaID)
Où QueryType donne le type d'information à récupérer, Criteria définit les contraintes sur ces informations
SchemaID n'est utilisé que si QueryType est adSchemaProviderSpecific.
Pour avoir la liste complète des possibilités reportez-vous à l'aide MSDN (Méthode OpenSchema (ADO)).
Comme nous le voyons, les informations renvoyées se trouvent dans un recordset. Pour voir le principe de la méthode, observons le code suivant :
Private Sub RecupSchema()
Dim cnn1 As ADODB.Connection, ReqTable As ADODB.Recordset, ReqChamp As ADODB.Recordset, compteur As Long
Dim NomTab As String, fso As FileSystemObject, Fich As TextStream
Set fso = New FileSystemObject
Set Fich = fso.CreateTextFile("d:\Schema1.txt", True)
Set cnn1 = New ADODB.Connection
With cnn1
.Provider = "Microsoft.Jet.OLEDB.4.0;"
.Properties("Jet OLEDB:System database") = "D:\ADOX\system.mdw"
.Open "Data Source=D:\ADOX\baseheb.mdb ;User Id=Admin; Password="
End With
Set ReqTable = cnn1.OpenSchema(adSchemaTables)
Do Until ReqTable.EOF
If ReqTable.Fields("TABLE_TYPE") = "TABLE" Then
Fich.WriteLine "Nom : " & ReqTable!table_name & " type: " & ReqTable!table_type & " description : " & ReqTable!Description
NomTab = ReqTable.Fields("TABLE_NAME")
Set ReqChamp = cnn1.OpenSchema(adSchemaColumns, Array(Empty,Empty, NomTab, Empty))
Fich.Write vbTab
For compteur = 0 To ReqChamp.Fields.Count - 1
Fich.Write ReqChamp.Fields(compteur).Name & vbTab
Next compteur
Fich.WriteBlankLines 1
Fich.WriteLine ReqChamp.GetString(adClipString, -1, vbTab,vbCrLf)
End If
ReqTable.MoveNext
Loop
Fich.Close
End SubCe code récupère le schéma des tables dans le recordset ReqTable, et pour chaque table, extrait le schéma des colonnes. Observons la ligne suivante :
Set ReqChamp = cnn1.OpenSchema(adSchemaColumns, Array(Empty, Empty, NomTab, Empty))Si nous regardons l'aide, nous trouvons dans le tableau :
|
QueryType |
Criteria |
|---|---|
|
adSchemaColumns |
TABLE_CATALOG |
C'est donc pour obtenir la liste des champs d'une table que j'utilise Array(Empty, Empty, NomTab, Empty). Notez bien que si dans la ligne je remplace « NomTab » par « ReqTable.Fields( »TABLE_NAME« ) » j'obtiens une erreur du fournisseur.
Les constantes QueryType n'étant pas toujours très claires, et de manière générale pour comprendre les notions de schéma et de catalogue -> https://sqlpro.developpez.com/cours/sqlaz/ddl/
De nombreuses valeurs de QueryType pourraient déclencher une erreur. En effet, tout ce qui est lié à un utilisateur demanderait une connexion intégrant le fichier de sécurité (.mdw) pour peu que celui-ci ne soit pas celui enregistré dans la clé de registre. Nous verrons ce point plus en détail lors de l'étude de la sécurité.


