Introduction à ADOX
Microsoft ActiveX Data Objects Extensions for Data Definition Language and Security (ADOX) étend les objets et le modèle de programmation ADO. Il fournit des objets pour la création et la modification de schémas, ainsi que pour la gestion de la sécurité. En s'appuyant sur des objets pour les opérations de schéma, ADOX permet d'écrire du code compatible avec diverses sources de données, indépendamment de leur syntaxe native.
ADOX complète les objets ADO fondamentaux. Les objets supplémentaires permettent de créer, modifier et supprimer des objets de schéma tels que les tables et les procédures stockées. Il inclut également des objets de sécurité pour gérer les utilisateurs et les groupes, ainsi que pour attribuer et révoquer des permissions sur des objets.
Pour utiliser ADOX dans un environnement de développement, vous devez établir une référence à la bibliothèque de types ADOX. La description de cette bibliothèque est "Microsoft ADO Ext. for DDL and Security", le nom de fichier est "Msadox.dll" et son ProgID est "ADOX". Consultez la documentation de votre outil de développement pour plus de détails sur la création de références de bibliothèque.
Objets ADOX
- Catalog : Contient une collection d'objets décrivant le répertoire de schéma d'une source de données.
- Column : Représente une colonne d'une table, d'un index ou d'une clé.
- Group : Représente un compte de groupe ayant des droits d'accès dans une base de données sécurisée.
- Index : Représente un index dans une table de base de données.
- Key : Représente une clé primaire, étrangère ou unique dans une table de base de données.
- Procedure : Représente une procédure stockée.
- Tible : Représente une table de base de données, incluant ses colonnes, index et clés.
- User : Représente un compte utilisateur ayant des droits d'accès dans une base de données sécurisée.
- View : Représente un ensemble filtré d'enregistrements ou une table virtuelle.
Méthodes ADOX
- Append : Ajoute un nouvel objet (Column, Group, Index, Key, Procedure, Table, User, View) à une collection.
- ChangePassword : Modifie le mot de passe d'un compte utilisateur.
- Create : Crée un nouveau catalogue.
- Delete : Supprime un objet d'une collection.
- GetObjectOwner : Récupère le propriétaire d'un objet dans un catalogue.
- GetPermissions : Obtient les permissions d'un groupe ou d'un utilisateur sur un objet.
- Item : Retourne un membre spécifique d'une collection par son nom ou son index.
- Refresh : Met à jour les objets d'une collection pour refléter ceux disponibles auprès du fournisseur.
- SetObjectOwner : Définit le propriétaire d'un objet dans un catalogue.
- SetPermissions : Définit les permissions d'un groupe ou d'un utilisateur sur un objet.
Propriétés ADOX
- ActiveConnection : Indique l'objet Connection ADO auquel le catalogue appartient.
- Attributes : Décrit les caractéristiques d'une colonne.
- Clustered : Indique si un index est groupé.
- Command : Spécifie un objet Command ADO utilisable pour créer ou exécuter une procédure.
- Count : Indique le nombre d'objets dans une collection.
- DateCreated : Indique la date de création d'un objet.
- DateModified : Indique la date de la dernière modification d'un objet.
- DefinedSize : Indique la taille maximale définie d'une colonne.
- DeleteRule : Indique l'action entreprise lorsqu'une clé primaire est supprimée.
- IndexNulls : Indique si les enregistrements avec des valeurs Null dans les champs d'index sont indexés.
- Name : Indique le nom de l'objet.
- NumericScale : Indique la plage des valeurs numériques dans une colonne.
- ParentCatalog : Spécifie le catalogue parent d'une table ou d'une colonne pour accéder aux propriétés spécifiques du fournisseur.
- Precision : Indique la précision maximale des valeurs de données dans une colonne.
- PrimaryKey : Indique si un index représente la clé primaire d'une table.
- RelatedColumn : Indique le nom de la colonne associée dans la table associée (pour les colonnes de clé uniquement).
- RelatedTable : Indique le nom de la table associée.
- SortOrder : Indique l'ordre de tri d'une colonne (pour les colonnes d'index uniquement).
- Type (Column) : Indique le type de données d'une colonne.
- Type (Key) : Indique le type de données d'une clé.
- Type (Table) : Indique le type d'une table.
- Unique : Indique si une clé d'index doit être unique.
- UpdateRule : Indique l'action entreprise lorsqu'une clé primaire est mise à jour.
Exemples de Code
1. Création d'une base de données
Cet exemple montre comment créer une nouvelle base de données Jet à l'aide de la méthode Create.
Code VBScript (ASP) :
Set cat = Server.CreateObject("ADOX.Catalog")
cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\nouvelle_base.mdb"
Set cat = Nothing
Code VBA :
Sub CreerBaseDeDonnees()
Dim cat As Object ' Utiliser Object pour une liaison tardive
Set cat = CreateObject("ADOX.Catalog")
cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\nouvelle_base.mdb"
Set cat = Nothing
End Sub
2. Création d'une table
Code VBScript (ASP) :
<%
Set cat = Server.CreateObject("ADOX.Catalog")
dbPath = Server.MapPath("/data/ma_base.mdb") ' Assurez-vous que le chemin est correct
cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath
Set tbl = Server.CreateObject("ADOX.Table")
tbl.Name = "MaTable"
' Ajout de colonnes
tbl.Columns.Append "ID", 3 ' adInteger
tbl.Columns.Append "Nom", 202, 50 ' adVarWChar, taille 50
' Ajout de la table au catalogue
cat.Tables.Append tbl
Set tbl = Nothing
Set cat = Nothing
%>
Code VBA :
Sub CreerTable()
Dim tbl As Object ' ADOX.Table
Dim cat As Object ' ADOX.Catalog
Set cat = CreateObject("ADOX.Catalog")
' Connexion à une base de données existante ou création si nécessaire
cat.ActiveConnection = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Chemin\Vers\MaBase.mdb;"
Set tbl = CreateObject("ADOX.Table")
tbl.Name = "MaTablePersonnalisee"
' Ajout de colonnes avec types ADO
tbl.Columns.Append "Identifiant", adInteger
tbl.Columns.Append "Description", adVarWChar, 100
' Ajout de la table au catalogue
cat.Tables.Append tbl
Set tbl = Nothing
Set cat = Nothing
End Sub
3. Création d'un index
Cet exemple montre comment créer un index sur plusieurs colonnes d'une table.
Code VBA :
Sub CreerIndexSurTable()
Dim tbl As Object ' ADOX.Table
Dim idx As Object ' ADOX.Index
Dim cat As Object ' ADOX.Catalog
Set cat = CreateObject("ADOX.Catalog")
cat.ActiveConnection = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Chemin\Vers\MaBase.mdb;"
' Définir la table et l'ajouter au catalogue si elle n'existe pas
' Si la table existe déjà, vous pouvez y accéder directement
If Not TableExiste(cat, "MaTablePersonnalisee") Then
Set tbl = CreateObject("ADOX.Table")
tbl.Name = "MaTablePersonnalisee"
tbl.Columns.Append "Identifiant", adInteger
tbl.Columns.Append "NomClient", adVarWChar, 50
tbl.Columns.Append "DateCreation", adDate
cat.Tables.Append tbl
Else
Set tbl = cat.Tables("MaTablePersonnalisee")
End If
' Définir un index sur plusieurs colonnes
Set idx = CreateObject("ADOX.Index")
idx.Name = "IndexSurNomEtDate"
idx.Columns.Append "NomClient"
idx.Columns.Append "DateCreation"
idx.Unique = False ' Permettre les doublons
' Ajouter l'index à la table
tbl.Indexes.Append idx
Set idx = Nothing
Set tbl = Nothing
Set cat = Nothing
End Sub
' Fonction utilitaire pour vérifier l'existence d'une table
Function TableExiste(catalog As Object, tableName As String) As Boolean
On Error Resume Next
Dim tempTable As Object
Set tempTable = catalog.Tables(tableName)
TableExiste = Err.Number = 0
On Error GoTo 0
Set tempTable = Nothing
End Function
4. Création d'une clé étrangère
Cet exemple crée une clé étrangère entre deux tables, en supposant que les tables "Clients" et "Commandes" existent.
Code VBA :
Sub CreerCleEtrangere()
Dim keyForeign As Object ' ADOX.Key
Dim cat As Object ' ADOX.Catalog
Set cat = CreateObject("ADOX.Catalog")
cat.ActiveConnection = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Chemin\Vers\MaBase.mdb;"
' Vérifier si la table 'Commandes' existe avant d'ajouter la clé
If TableExiste(cat, "Commandes") Then
Set keyForeign = CreateObject("ADOX.Key")
keyForeign.Name = "FK_Commandes_Clients"
keyForeign.Type = adKeyForeign ' Type de clé étrangère
' Définir la table et la colonne de référence
keyForeign.RelatedTable = "Clients"
keyForeign.Columns.Append "ClientID" ' Colonne dans la table des commandes
' Définir la colonne correspondante dans la table de référence
keyForeign.Columns("ClientID").RelatedColumn = "ClientID" ' Colonne dans la table des clients
' Spécifier la règle de mise à jour (ex: cascade)
keyForeign.UpdateRule = adRICascade
' Ajouter la clé étrangère à la table des commandes
cat.Tables("Commandes").Keys.Append keyForeign
Else
MsgBox "La table 'Commandes' n'existe pas.", vbExclamation
End If
Set keyForeign = Nothing
Set cat = Nothing
End Sub
' Fonction utilitaire pour vérifier l'existence d'une table (déjà définie précédemment)
' Function TableExiste(catalog As Object, tableName As String) As Boolean ...
Constantes de Type de Colonne (Exemple : adVarWChar)
La propriété Type d'un objet Column spécifie son type de données. Voici quelques constantes couramment utilisées :
adTinyInt: Entier très petit.adSmallInt: Petit entier.adInteger: Entier standard.adBigInt: Très grand entier.adSingle: Nombre à virgule flottante simple précision.adDouble: Nombre à virgule flottante double précision.adCurrency: Type monétaire.adBoolean: Booléen (0 pour faux, non-0 pour vrai).adDate: Date et heure.adChar: Chaîne de caractères de longueur fixe.adVarChar: Chaîne de caractères de longueur variable.adWChar: Chaîne de caractères larges (Unicode) de longueur fixe.adVarWChar: Chaîne de caractères larges (Unicode) de longueur varible. (Valeur par défaut pour les colonnes de type chaîne).adBinary: Données binaires de longueur fixe.adVarBinary: Données binaires de longueur variable.adGuid: Identifiant global unique (GUID).
La valeur par défaut pour les colonnes de type chaîne est adVarWChar.
Comparaison ADO vs ADOX pour lister les tables Excel
Voici une comparaison pour lister les tables (feuilles) d'un fichier Excel.
Utilisation de ADO :
Dim cDefPath As String
Const adSchemaTables As Long = 20 ' Constante pour les schémas de tables
Dim xlsFile As String
Dim conn As Object ' ADODB.Connection
Dim rs As Object ' ADODB.Recordset
cDefPath = Addbs(Justpath(Sys(16))) ' Obtient le chemin du répertoire courant
xlsFile = cDefPath & "Book1.xls"
Set conn = CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0';Data Source=" & xlsFile
Set rs = conn.OpenSchema(adSchemaTables)
Do While Not rs.EOF
' Affiche le nom de la table (feuille)
Debug.Print Trim(rs.Fields("TABLE_NAME").Value, "$") ' Utilise TABLE_NAME pour plus de clarté
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
Utilisation de ADOX :
Dim cDefPath As String
Dim xlsFile As String
Dim cat As Object ' ADOX.Catalog
Dim tableObj As Object ' ADOX.Table
cDefPath = Addbs(Justpath(Sys(16)))
SetDefault dllpath cDefPath ' Définit le répertoire par défaut
xlsFile = cDefPath & "Book1.xls"
Set cat = CreateObject("ADOX.Catalog")
cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0';Data Source=" & xlsFile
For Each tableObj In cat.Tables
' Vérifie si le nom de la table se termine par '$', typique pour les feuilles Excel
If Right(tableObj.Name, 1) = "$" Then
Debug.Print tableObj.Name
End If
Next tableObj
Set tableObj = Nothing
Set cat = Nothing