Vous êtes sur la page 1sur 45

Utiliser le modle ADOX avec Visual Basic

Par Jean-Marc Rabilloud

Date de publication : 15 avril 2003


Dernire mise jour : 16 janvier 2008

Cours complet sur ADOX et rappels sur ADO

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

I - Introduction..............................................................................................................................................................5
I-A - Prambule...................................................................................................................................................... 5
II - Rappels Access..................................................................................................................................................... 7
II-A - Scurit......................................................................................................................................................... 7
II-B - Paramtrage JET.......................................................................................................................................... 7
III - Rappels ADO........................................................................................................................................................ 8
III-A - Proprits statiques & dynamiques (Properties)......................................................................................... 8
III-B - L'objet Connection........................................................................................................................................8
III-C - L'objet Command......................................................................................................................................... 9
III-C-1 - Gnralits.......................................................................................................................................... 9
III-C-2 - Proprits............................................................................................................................................ 9
III-C-2-a - ActiveConnection........................................................................................................................ 9
III-C-2-b - CommandText & CommandStream.......................................................................................... 10
III-C-2-c - CommandTimeout..................................................................................................................... 10
III-C-2-d - CommandType..........................................................................................................................10
III-C-2-e - Prepared................................................................................................................................... 10
III-C-2-f - State...........................................................................................................................................10
III-C-3 - Mthodes........................................................................................................................................... 11
III-C-3-a - Cancel....................................................................................................................................... 11
III-C-3-b - Execute..................................................................................................................................... 11
III-C-3-c - CreateParameter.......................................................................................................................11
III-C-4 - Collection Properties......................................................................................................................... 11
III-C-5 - Collection Parameters....................................................................................................................... 12
III-C-5-a - Gnralits................................................................................................................................12
III-C-5-b - Quelques mthodes de la collection........................................................................................ 12
III-C-6 - Objet Parameter................................................................................................................................ 12
III-C-6-a - Proprits..................................................................................................................................12
III-C-6-b - Mthode.................................................................................................................................... 13
III-C-7 - Exemple.............................................................................................................................................13
III-C-7-a - Requtes paramtres............................................................................................................. 13
III-C-7-b - DDL........................................................................................................................................... 14
III-C-7-c - Procdure stocke.................................................................................................................... 14
IV - OpenSchema...................................................................................................................................................... 16
V - Modle objet........................................................................................................................................................ 18
VI - Notions Fondamentales...................................................................................................................................... 19
VI-A - ADOX & Access........................................................................................................................................ 19
VI-B - Propritaire.................................................................................................................................................19
VI-C - ParentCatalog............................................................................................................................................ 19
VII - L'objet Catalog................................................................................................................................................... 20
VIII - Collections de l'objet Catalog........................................................................................................................... 21
VIII-A - Mthodes................................................................................................................................................. 21
VIII-A-1 - Append............................................................................................................................................ 21
VIII-A-2 - Item..................................................................................................................................................21
VIII-A-3 - Delete.............................................................................................................................................. 21
VIII-A-4 - Refresh............................................................................................................................................ 21
VIII-B - Collection tables...................................................................................................................................... 21
VIII-B-1 - Append............................................................................................................................................ 21
VIII-C - Collection Procedures..............................................................................................................................21
VIII-C-1 - Append............................................................................................................................................ 22
VIII-D - Collection Views...................................................................................................................................... 22
VIII-D-1 - Append............................................................................................................................................ 22
VIII-E - Collection Groups.................................................................................................................................... 22
VIII-E-1 - Append............................................................................................................................................ 22
VIII-F - Collection Users....................................................................................................................................... 22
VIII-F-1 - Append............................................................................................................................................ 22
IX - L'objet Table........................................................................................................................................................23
IX-A - Collection Properties..................................................................................................................................23
IX-B - Collection Columns.................................................................................................................................... 24
-2Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

IX-B-1 - Objet Column.................................................................................................................................... 24


Proprits................................................................................................................................................... 24
Collection Properties..................................................................................................................................25
Exemple..................................................................................................................................................... 25
IX-C - Collection Indexes..................................................................................................................................... 26
IX-C-1 - Objet Index........................................................................................................................................26
Clustered.................................................................................................................................................... 27
IndexNulls...................................................................................................................................................27
PrimaryKey.................................................................................................................................................27
Unique........................................................................................................................................................ 27
Collection Properties..................................................................................................................................27
Collection Columns et objet Column.........................................................................................................27
SortOrder....................................................................................................................................................27
Exemple..................................................................................................................................................... 27
IX-D - Collection Keys..........................................................................................................................................28
IX-D-1 - Quelques notions.............................................................................................................................. 28
Cl primaire................................................................................................................................................28
Cl trangre............................................................................................................................................. 28
Intgrit rfrentielle.................................................................................................................................. 28
Opration en cascade............................................................................................................................... 28
IX-D-2 - Mthode Append...............................................................................................................................28
IX-D-3 - Objet Key.......................................................................................................................................... 29
DeleteRule..................................................................................................................................................29
Name..........................................................................................................................................................29
RelatedTable.............................................................................................................................................. 29
Type............................................................................................................................................................29
UpdateRule................................................................................................................................................ 29
Collection Columns et objet Column.........................................................................................................29
IX-D-4 - Exemple............................................................................................................................................ 30
IX-E - Conclusion sur les tables.......................................................................................................................... 31
X - L'objet Procedure.................................................................................................................................................32
X-A - Cration d'un objet procdure.................................................................................................................... 32
X-A-1 - Pas d'objet Parameter....................................................................................................................... 32
Exemple..................................................................................................................................................... 32
X-B - Modification d'un objet Procedure.............................................................................................................. 33
XI - L'objet View.........................................................................................................................................................34
XI-A - Conclusion sur les objets View & Procedure............................................................................................ 34
XII - Gestion des utilisateurs..................................................................................................................................... 35
XII-A - Cas particulier d'Access........................................................................................................................... 35
XII-B - Proprits et droits................................................................................................................................... 35
XII-B-1 - Propritaire....................................................................................................................................... 35
XII-B-2 - Administrateur.................................................................................................................................. 36
XII-B-2-a - Access..................................................................................................................................... 36
XII-B-3 - Utilisateurs et groupes..................................................................................................................... 36
XII-B-4 - Hritage des objets.......................................................................................................................... 36
XII-C - Objet Group.............................................................................................................................................. 37
XII-C-1 - SetPermissions................................................................................................................................ 37
ObjectType................................................................................................................................................. 37
Name..........................................................................................................................................................37
Action......................................................................................................................................................... 37
Rights......................................................................................................................................................... 38
Inherit......................................................................................................................................................... 39
ObjectTypeId.............................................................................................................................................. 40
XII-C-2 - GetPermissions................................................................................................................................ 40
XII-D - Objet User................................................................................................................................................ 41
XII-D-1 - ChangePassword............................................................................................................................. 41
XII-D-2 - GetPermissions & SetPermissions.................................................................................................. 41
XII-D-3 - Properties......................................................................................................................................... 41
-3Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

XII-E - Exemple.................................................................................................................................................... 41
XII-F - Techniques de scurisation...................................................................................................................... 42
XII-F-1 - Modification.......................................................................................................................................42
XII-F-2 - Cration............................................................................................................................................ 43
XII-F-3 - Une autre solution : le DDL............................................................................................................. 43
XII-G - Conclusion sur la scurit........................................................................................................................44
XIII - Conclusion........................................................................................................................................................ 45
XIII-A - Remerciements........................................................................................................................................ 45

-4Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

I - Introduction
Le prsent article va aborder la programmation du modle objet ADOX (Microsoft ActiveX Data Objects
Extensions) pour le Langage de Dfinition des Donnes (DDL = Data Definition Language and Security).
Ds prsent, il faut bien comprendre que la bibliothque ADOX sert pour la cration ou la modification d'une base
de donnes. Pour une simple consultation, il est beaucoup plus efficace d'utiliser la mthode OpenSchema d'ADO.
Toutefois, des fins explicatives, vous trouverez du code "de consultation" dans cet article.
Ce qui tait du temps de DAO dans l'objet Database, c'est dire la structure de la base (table, vue...) et dans
l'objet Workspace (utilisateurs, groupes) se trouve runi dans le modle objet ADOX. Avant de pouvoir l'utiliser, il faut
rfrencer la bibliothque "Microsoft ADO Ext. 2.x for DDL and Security"
Il n'est pas toujours vident de voir la limite entre les modles ADO et ADOX. Pour simplifier, on utilise ADOX pour
crer ou modifier un lment de la base de donnes, et ADO pour manipuler les donnes. De plus ADOX est le seul
moyen de grer les utilisateurs et les groupes.
Dans la suite de cet article, aprs avoir vu quelques gnralits, nous allons parcourir le modle objet tout en
voyant les piges et astuces qui le composent, avec des exemples de cration d'une base de donnes afin de bien
comprendre son utilisation.
N.B : Comme nous le verrons par la suite, de nombreuses proprits dpendent du fournisseur de donnes. Donc,
il vous appartiendra de vous renseigner sur les capacits du fournisseur qui vous intresse.
Fondamentaux ADOX (Microsoft)
Si vous ne l'avez pas dj fait je vous invite aussi lire :
-> Accs aux bases de donnes "ADO" avec Visual Basic 6.0
-> tutoriel ADO pour VB6
Remarque : Les exemples de cet article ont t faits avec une base Access 2000 et ADOX version 2.7.
Attention : Le fournisseur Jet 3.51 ignore un grand nombre des fonctionnalits exposes dans cet article, notamment
sur la scurit.
Si vous avez des questions poser, venez sur les forums de http://www.developpez.com/
-> Forum Visual Basic
-> Forum Access
En respectant les rgles du forum.

I-A - Prambule
La quasi-totalit des exemples de cet article porte sur la programmation d'une base Access. Pourtant on peut noter
que :
Pour la programmation des bases Access DAO est un modle beaucoup plus complet qu'ADO.
ADO est plutt orient SQL-Server.
-5Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

J'ai fais ce choix car fondamentalement les diffrences sont uniquement dues aux fournisseurs et que le fournisseur
Jet est le plus complexe programmer. Partant du principe que les utilisateurs Access sont nombreux utiliser ADO
depuis la version 2000, j'ai cris cet article afin qu'ils puissent comprendre les problmes qu'ils rencontrent. Pour les
utilisateurs d'autres SGBD, les problmes ne seront que moins nombreux.
Bonne lecture.

-6Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

II - Rappels Access
II-A - Scurit
Il y a deux types de scurit Access : la scurit au niveau partage, c'est dire l'utilisation d'un mot de passe
pour ouvrir la base de donnes et la scurit au niveau utilisateur semblable aux autres SGBD. Celle-ci repose
sur l'identification de l'utilisateur, celui-ci ayant un certain nombre de droits dfinis. La diffrence d'Access vient de
l'utilisation d'un fichier externe pour grer cette scurit. Les deux niveaux de scurit sont cumulables.

II-B - Paramtrage JET


Par dfaut, le paramtrage du moteur Jet se trouve dans la base de registre la cl :
HKLM\Software\Microsoft\Jet\4.0\Engines\Jet 4.0.
Ce paramtrage pouvant tre diffrent d'un poste l'autre, il convient d'utiliser le code pour toujours mettre ce
paramtrage aux valeurs dsires. Pour cela deux approches sont possibles : la modification des valeurs du registre
ou le paramtrage de la connexion (mthode que nous verrons plus loin).

-7Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

III - Rappels ADO


Sans que cet article couvre le modle ADO, nous allons voir ici quelques notions qui nous seront utiles pour l'utilisation
d'ADOX ou la rcupration de schma.

III-A - Proprits statiques & dynamiques (Properties)


Dans le modle ADO et a fortiori dans le modle ADOX, de nombreux objets possdent une collection un peu
particulire : "Properties". Celle ci concerne des proprits dites dynamiques par opposition aux proprits habituelles
des objets (statiques). Ces proprits dpendent du fournisseur de donnes, elles ne sont en gnral accessibles
qu'aprs la cration de l'objet (et ventuellement l'application d'une mthode refresh sur la collection) voire aprs
l'ouverture de l'objet.
On ne peut pas accder une proprit statique par l'intermdiaire de la collection Properties.
Un objet Property dynamique comporte quatre proprits intgres qui lui sont propres, savoir :

La proprit Name qui est une chane identifiant la proprit


La proprit Type qui est un entier spcifiant le type de donne de la proprit.
La proprit Value qui est un variant contenant la valeur de la proprit.
La proprit Attributes qui est une valeur de type Long indiquant les caractristiques de proprits
spcifiques au fournisseur.

III-B - L'objet Connection


Dans son utilisation la plus courante la chane de connexion prend deux paramtres : le fournisseur et la source de
donnes. Pourtant l'objet Connection comprend de nombreuses proprits permettant de grer le mode d'accs, la
scurit, le paramtrage Jet, etc...
Pour mieux apprhender l'objet Connection et ses proprits, regardons le code suivant.
Dim cnn1 As ADODB.Connection
Set cnn1 = New ADODB.Connection
With cnn1
Debug.Print .Properties.Count
.Provider = "Microsoft.Jet.OLEDB.4.0;"
.ConnectionTimeout = 30
.CursorLocation = adUseClient
.Mode = adModeShareExclusive
.Properties("Jet OLEDB:System database") = "D:\User\jmarc\tutorial\ADOX\system.mdw"
Debug.Print .Properties.Count
.Open "Data Source=D:\User\jmarc\tutorial\ADOX\baseheb.mdb ;User Id=Admin; Password="
Debug.Print .Properties.Count
End With

Si vous excutez ce code en l'tat, vous allez avoir l'erreur "Le fournisseur indiqu est diffrent de celui dj
utilis" [3220 - adErrCantChangeProvider]
Ceci vient du fait que l'appel de Properties.Count cre l'instance de l'objet et non le Set comme une erreur courante
le fait penser. Or comme ce moment le fournisseur n'a pas t dfini, ADO utilises le fournisseur par dfaut
"MSDASQL.1". Ds lors, il n'est plus possible de modifier le fournisseur ce qui dclenche une erreur.
Rgle n1 : On doit toujours dfinir la proprit Provider en premier sur un objet Connection.
On enlve donc le premier Debug.Print et on excute le code. On observe le rsultat dans la fentre correction et
on constate qu'il y a 27 proprits avant l'ouverture et 94 aprs.
-8Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

Rgle n2 : On valorise les proprits statiques et les proprits dynamiques dpendantes du fournisseur avant
l'ouverture de la connexion.
En fait les proprits dpendantes du fournisseur qu'il nous faut valoriser avant l'ouverture sont celles qui grent la
scurit (voir le chapitre correspondant).
Stricto sensu, on peut valoriser toutes ces proprits lors de l'ouverture de la connexion, mais pour des raisons de
maintenance (lisibilit) il est souvent utile de dcomposer la connexion avant l'ouverture. La chane de connexion
passer dans ce cas serait :
Cnn1.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Password="";User
ID=Admin;Data Source=D:\User\jmarc\tutorial\ADOX\baseheb.mdb;Mode=Share
Deny Read|Share Deny Write;Extended Properties="";Jet OLEDB:System
database=D:\User\jmarc\tutorial\ADOX\system.mdw;Jet OLEDB:Registry
Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet
OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet
OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet
OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet
OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica
Repair=False;Jet OLEDB:SFP=False"

Rgle n3 : Lorsqu'on doit valoriser plusieurs proprits de la connexion, on le fait en dehors de la chane de
connexion.
Il y aurait encore de nombreuses choses dire sur l'objet Connection, mais cela sort du cadre de cet article.

III-C - L'objet Command


Beaucoup de programmeurs n'utilisent pas l'objet Command avec ADO prfrant travailler directement avec l'objet
Recordset. Dans le modle ADOX, l'objet Command est indispensable. Nous allons donc aborder l'objet Command
de faon assez dtaille sous l'angle suivant:
Utilisation de Command pour crer des requtes stockes dans la base de donnes
(paramtres ou non)
Sachez toutefois que l'objet Command s'utilise dans de nombreuses autres situations. Nous allons commencer par
voir l'objet Command en dtail.

III-C-1 - Gnralits
Un objet command reprsente une commande spcifique excuter sur une source de donnes. Ceci peut tre une
instruction SQL ou une requte/procdure stocke dans la base ou cre l'excution. Un objet Command dpend
toujours d'une connexion soit cre spcifiquement pour cette commande, soit d'une connexion dj existante.

III-C-2 - Proprits
III-C-2-a - ActiveConnection
Dfinit la connexion utilise pour l'objet Command. Cette proprit doit tre passe Nothing avant de changer la
connexion d'un objet Command. Comme les objets Command hritent de certaines proprits de la connexion, faites
attention au paramtrage de celle-ci.

-9Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

III-C-2-b - CommandText & CommandStream


Nous n'tudierons pas dans cet article la programmation de l'objet Stream. Sachez toutefois qu'il est indispensable
pour la programmation Internet et l'utilisation du XML. Ces deux proprits sont exclusives. La proprit
CommandText contient le texte de la commande excuter. Ce texte peut tre le nom d'une procdure stocke,
une chane SQL etc...

III-C-2-c - CommandTimeout
La valeur est en secondes. S'applique en gnral sur l'objet Connection

III-C-2-d - CommandType
Donne le type de la commande. Cette proprit est trs importante. En effet, il y aura une erreur rcuprable si
le paramtre donn est faux. De plus ne pas valoriser correctement cette proprit peut dgrader fortement les
performances. Les valeurs peuvent tre :

adCmdText

Constante

Description
CommandText correspond la dfinition
textuelle d'une commande ou d'un appel de
procdure stocke
CommandText correspond au nom de table
dont les colonnes sont toutes renvoyes par
une requte SQL gnre en interne.
CommandText correspond un nom de table
dont les colonnes sont toutes renvoyes.
CommandText correspond au nom d'une
procdure stocke.
Valeur utilise par dfaut. Le type de
commande de la proprit CommandText est
inconnu
CommandText correspond au nom de fichier
d'un Recordset permanent
CommandText correspond une commande
ou une procdure stocke qui en renvoie
pas de ligne (par exemple, une commande
qui insre uniquement des donnes). Si
des lignes sont extraites, elles ne sont
pas prises en compte et ne sont pas
retournes. Toujours associe adCmdText
ou adCmdStoredProc

adCmdTable
adCmdTableDirect
adCmdStoredProc
adCmdUnknown
adCmdFile
adExecuteNoRecords

Attention toutefois, une procdure stocke peut tre diffremment interprte selon les
SGBD. Voir aussi la rubrique "Parameters".

III-C-2-e - Prepared
Dtermine si une commande doit tre Pr-compile. N'est utile que si la commande doit tre excute plusieurs fois.
Attention, certains fournisseurs n'acceptent pas cette modification sans toutefois dclencher d'erreur.

III-C-2-f - State
Renvoie l'tat de la commande (ouverte ou ferme)
- 10 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

III-C-3 - Mthodes
III-C-3-a - Cancel
Annule l'excution de la commande si celle-ci est asynchrone.

III-C-3-b - Execute
Execute la commande. De la forme command.Execute RecordsAffected, Parameters, Options
Remarques sur la mthode Execute
Vous aurez not qu'il existe une mthode Execute sur l'objet Connection et sur l'objet Command. Elles sont
sensiblement identiques si ce n'est :
Une commande est rutilisable
Un objet Command est ncessaire pour les requtes paramtres et les procdures stockes.
Notez aussi qu'un recordset cr l'aide de Connection.Execute hrite des proprits de la connexion.

III-C-3-c - CreateParameter
Sert crer un paramtre (voir explications plus loin).
De la forme command.CreateParameter (Name, Type, Direction, Size, Value)
Attention ne pas faire une erreur courante avec cette mthode. Celle-ci cre un paramtre mais ne l'ajoute pas
la collection Parameters de l'objet Command. Ceci est d'ailleurs indispensable afin de pouvoir valoriser d'autres
proprits avant l'ajout.

III-C-4 - Collection Properties


C'est la collection des proprits dynamiques de l'objet Command. Comme il y en a beaucoup, nous n'allons pas
toutes les voir en dtail, mais certaines mritent que nous nous y arrtions. Pourquoi?
Lors de l'utilisation d'un objet recordset, la dfinition des paramtres de celui-ci valorise un certain nombre de
proprits. Ceci n'est pas le cas sur un objet Command. En tout tat de cause, ceci n'a pas d'importance si l'objet
Command ne renvoie pas un recordset.
Bookmarkable

Boolean

Read/Write/Required

FAUX

Read/Write/Required

Permet d'utiliser un Recordset qui accepte les signets.


Jet OLEDB:Bulk Transactions

Integer

Dtermine si les requtes action sont acceptes de faon partielle ou globale. De manire gnrale, les transactions
partielles ne devaient jamais tre autorises.
Jet OLEDB:ODBC PassThrough Statement

Boolean

Read/Write/Required

FAUX

- 11 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

Dfini les requtes SQL directes


Notion SQL Direct
Les requtes SQL direct taient utilises avec DAO pour crire des requtes n'ayant pas besoin d'tre interprtes
par Jet lors d'accs a des donnes externes. Comme une telle requte doit avoir une connexion vers la source de
donnes, il n'est plus la peine de faire des requtes SQL Direct.
Lock Mode

Integer

Read/Write/Required

Dtermine dans une certaine mesure le mode de verrouillage. Cette proprit ne peut pas tre dissocie de la
proprit IsolationLevel
Others' Changes Visible

Boolean

Read/Write/Required

FAUX

Permet l'utilisation multi-utilisateurs

III-C-5 - Collection Parameters


III-C-5-a - Gnralits
Les utilisateurs d'autres SGBD qu'Access veilleront bien faire la diffrence entre procdure stocke et requte
paramtre.
Quoique regroups dans la mme collection, il existe deux types de paramtres. Les paramtres d'entre, attendus
par la procdure/requte pour pouvoir s'excuter, et les paramtres de sortie qui peuvent tres renvoys par une
procdure. Il convient de faire attention avec ceux-ci, une connexion n'acceptant jamais plus de deux objets Command
ayant des paramtres de sortie (le paramtre de retour n'ayant pas d'influence).

III-C-5-b - Quelques mthodes de la collection.


Append
Ajoute un paramtre la collection. De la forme
Command.Parameters.Append Name, Type, DefinedSize, Attrib
Il est possible d'utiliser la mthode CreateParameter dans le Append. Vous devez avoir typ votre paramtre avant
ou lors de l'ajout la collection. Il est prfrable de valoriser votre paramtre avant de l'ajouter la collection afin
de ne pas solliciter le fournisseur.
Delete
Enlve un paramtre de la collection. On doit spcifier soit le nom, soit l'index du paramtre retirer.

III-C-6 - Objet Parameter


III-C-6-a - Proprits
Attributes

- 12 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

Prcise si le paramtre accepte les valeurs signes, binaires ou NULL.


Direction
Dfinit si le paramtre est un paramtre d'entre, de sortie ou de retour. Attention ne pas confondre un paramtre
de retour(adParamReturnValue) qui est l'entier ventuellement renvoy par une procdure (avec l'instruction Return)
d'un paramtre de sortie (adParamOutput) qui est le (ou les) paramtre renvoy par une procdure (en gnral des
valeurs tires de la base de donnes).
Name
Dfini le nom du paramtre. N'est pas obligatoire
NumericScale
Donne la prcision (nombre de chiffres droite de la virgule) d'un paramtre numrique.
Size
Donne la taille en octets d'un paramtre dont le type est potentiellement de longueur variable (par exemple String).
Ce paramtre est obligatoire pour les types de longueur indtermine (String, Variant).
Elle doit tre toujours valorise avant ou lors de l'ajout la collection.
Type
Comme son nom l'indique !
Ne vous emmlez pas les pinceaux entre les chanes adVarChar et les chanes Unicodes adVarWChar
Value
De manire gnrale, valorisez cette proprit aprs l'ajout la collection.

III-C-6-b - Mthode
AppendChunk
Permet d'accder aux textes ou binaires longs.

III-C-7 - Exemple
III-C-7-a - Requtes paramtres
Nous allons voir ici un exemple d'utilisation de requte paramtre.
Prenons la requte paramtre stocke dans la base nomme ReqFerie dfinie comme :
PARAMETERS DateCib DateTime;
SELECT tblFerie.DateFer
FROM tblFerie
WHERE (((tblFerie.DateFer)>DateValue([DateCib])))
ORDER BY tblFerie.DateFer;

- 13 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

La fonction suivante cre un recordset en utilisant l'objet Command.


Private Sub Command5_Click()
Dim cnn1 As ADODB.Connection, Comm1 As ADODB.Command, Param1 As Parameter,
MonRecordset As ADODB.Recordset
Set cnn1 = New ADODB.Connection
With cnn1
.Provider = "Microsoft.Jet.OLEDB.4.0;"
.ConnectionTimeout = 30
.CursorLocation = adUseClient
.IsolationLevel = adXactChaos
.Mode = adModeShareExclusive
.Properties("Jet OLEDB:System database") = "D:\User\jmarc\tutorial\ADOX\system.mdw"
.Open "Data Source=D:\User\jmarc\tutorial\ADOX\baseheb.mdb ;User
Id=Admin; Password="
End With
Set Comm1 = New ADODB.Command
With Comm1
.ActiveConnection = cnn1
.CommandType = adCmdStoredProc
.CommandText = "ReqFerie"
End With
Set Param1 = New Parameter
With Param1
.Direction = adParamInput
.Type = adDate
.Name = "DateCib"
End With
Comm1.Parameters.Append Param1
Comm1("DateCib").Value = #1/1/2002#
Set MonRecordset = Comm1.Execute
End Sub

Notez que tel que ce code est crit le curseur est statique en lecture seule. Ceci vient du fait qu'il s'agit d'une requte
Select dans le vrai sens du terme est que celle-ci n'est pas modifiable.

III-C-7-b - DDL
Je ne vais pas rentrer dans le dtail du DDL dans cet article mais sachez qu'il est directement utilisable avec l'objet
Command. Le code suivant crera une table avec un index:
With Comm1
.ActiveConnection = cnn1
.CommandType = adCmdText
.CommandText = "CREATE TABLE DeuximeTable(Prnom TEXT,Nom TEXT,
DateDeNaissance DATETIME,CONSTRAINT MaContrainteTable UNIQUE (Prnom, Nom,
DateDeNaissance)"
End With
Set MonRecordset = Comm1.Execute

III-C-7-c - Procdure stocke


Imaginons la procdure stocke suivante (SQL-Server) :
CREATE PROCEDURE LoginValide
@UserName varchar(15),
@Password varchar(10)
As
if exists(Select * From TblUtilisateur
Where Nom = @UserName
And
MotDePasse = @Password)
return(1)
else

- 14 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

return(0) Go

Nous allons pouvoir l'utiliser de la faon suivante en visual basic.


Private Sub Command5_Click()
Dim cnn1 As ADODB.Connection, Comm1 As ADODB.Command, Param1 As Parameter,
MonRecordset As ADODB.Recordset
Dim compteur As Long
Set cnn1 = New ADODB.Connection
strCnn = "Provider=sqloledb;Data Source=srv;Initial Catalog=Hebdo;User
Id=sa;Password=; "
Set Comm1 = New ADODB.Command
With Comm1
.ActiveConnection = cnn1
.CommandType = adCmdStoredProc
.CommandText = "LoginValide"
End With
For compteur = 1 To 3
Set Param1 = New Parameter
With Param1
.Direction = Choose(compteur, adParamInput, adParamInput, adParamReturnValue)
.Type = Choose(compteur, adVarChar, adVarChar, adInteger)
.Name = Choose(compteur, "Nom", "Passe", "Reponse")
.Size = Choose(compteur, 15, 10, 4)
End With
Comm1.Parameters.Append Param1
Set Param1 = Nothing
Next compteur
Comm1("Nom").Value = txtUser.Text
Comm1("Passe").Value = txtPassword.Text
Comm1.Execute
If Comm1("Reponse").Value = 0 Then Exit Sub
...
End Sub

La seule diffrence vient du fait qu'une procdure stocke peut renvoyer d'autres choses qu'un recordset. Dans
notre exemple la procdure attend deux paramtres (nom et mot de passe) et renvoie 0 ou 1 selon l'existence de
l'enregistrement dans la table.
Il faut que la rponse soit du type ReturnValue et non Output puisqu'elle est le rsultat de l'instruction Return.
N.B : Vous retrouverez souvent la notation Choose dans cet article.

- 15 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

IV - OpenSchema
Comme je l'ai dit plus avant, il faut utiliser plutt la mthode OpenSchema de l'objet Connection ADO pour rcuprer
des informations de structure. Cette mthode est de la forme suivante: Set recordset = connection. OpenSchema
(QueryType, Criteria, SchemaID)
O QueryType donne le type d'information rcuprer, Criteria dfinit les contraintes sur ces informations
SchemaID n'est utilis que si QueryType est adSchemaProviderSpecific.
Pour avoir la liste complte des possibilits reportez-vous l'aide MSDN (Mthode OpenSchema (ADO)).
Comme nous le voyons, les informations renvoyes se trouvent dans un recordset. Pour voir le principe de la mthode,
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 Sub

Ce code rcupre le schma des tables dans le recordset ReqTable, et pour chaque table extrait le schma 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
adSchemaColumns

Criteria
TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
COLUMN_NAME

- 16 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

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 trs claires, et de manire gnrale pour comprendre les notions de
schma et de catalogue -> http://sqlpro.developpez.com/cours/sqlaz/ddl/
De nombreuses valeurs de QueryType pourraient dclencher une erreur. En effet, tout
ce qui est li un utilisateur demanderait une connexion intgrant le fichier de scurit
(.mdw) pour peu que celui-ci ne soit pas celui enregistr dans la cl de registre. Nous
verrons ce point plus en dtail lors de l'tude de la scurit.

- 17 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

V - Modle objet
Le modle objet (ADOX 2.6) suivi est le suivant :

- 18 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

VI - Notions Fondamentales
VI-A - ADOX & Access
Dans ce modle, il y a une certaine redondance. Dans le cas d'Access, une requte non paramtre renvoyant des
enregistrements est considre comme une table de type "VIEW" (vues). Une telle requte apparatra donc comme
membre de la collection "Table" (un peu diffrente des autres tables) et comme membres de la collection "Views"
mais pas comme membre de la collection procdure.
Attention, dans Access il faut considrer une procdure comme une requte paramtre ou une requte ne renvoyant
pas d'enregistrement (Requte action par exemple) ; n'attendez pas de rcuprer des procdures VBA dans cette
collection.

VI-B - Propritaire
Cette notion de proprit est trs importante. En effet seul le propritaire d'un objet peut faire certaines modifications
sur celui-ci et attribuer les droits sur ces objets. Par dfaut, le propritaire d'un objet est son crateur. Cela implique
deux choses :
Ne pas laisser aux utilisateurs le droit de crer des objets dans vos bases sans un contrle car vous n'auriez pas de
droit de modifications sur ces objets sans en reprendre la proprit.
Grer strictement les droits sur la base.
Nous y reviendrons plus en dtail lorsque nous aborderons la scurit.

VI-C - ParentCatalog
Lorsque l'on cre des objets, ils ne sont relis aucun catalogue. Ds lors, comme ils ne connaissent pas leurs
fournisseurs, il n'est pas possible de valoriser leurs proprits. On dfinit donc la proprit ParentCatalog d'un objet
ds que l'on souhaite valoriser ses proprits. Ceci pourtant dissimule un problme d'un fort beau gabarit ma foi.
Outre le fournisseur, le catalogue transmet aussi ses droits de propritaire. Si on n'y prend pas garde, il se peut que
l'objet se retrouve ayant des droits non souhaits.

- 19 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

VII - L'objet Catalog


C'est l'objet racine du modle.
ActiveConnection (Prop. S)
C'est la seule proprit de l'objet Catalog, qui lui permet de dfinir le fournisseur de donnes, la base de donnes
et ventuellement les paramtres de scurit. Cette connexion est stricto sensu une connexion ADO, on peut
donc parfaitement utiliser une connexion existante. Attention toutefois, ce sont les paramtres de la connexion qui
dfinissent en partie les possibilits du fournisseur, il est donc vivement recommand de crer sa connexion pour la
gestion de la scurit. Les deux codes suivants permettent de dfinir la connexion :
Dim cnn1 As New ADODB.Connection, Catalogue As ADOX.
Set Catalogue = New ADOX.Catalog
With cnn1
.Provider = "Microsoft.Jet.OLEDB.4.0;"
.Properties("Jet OLEDB:System database") =
"D:\User\jmarc\tutorial\ADOX\system.mdw"
.Open "Data Source=D:\User\jmarc\tutorial\ADOX\baseheb.mdb ;User
Id=Admin; Password="
End With
Catalogue.ActiveConnection = cnn1

Ou
Catalogue.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & "DataSource=:\User
\jmarc\tutorial\ADOX\baseheb.mdb;Jet OLEDB:System database=" &"D:\User\jmarc\tutorial\ADOX
\system.mdw;User Id=Admin; Password="

Create (Mth.)
Permet la cration d'une nouvelle base de donnes selon les paramtres de la chane de connexion passe en
paramtre. Attention, le nom de la base de donnes ne doit pas tre une base existante. Le paramtre passer
la mthode doit tre une chane de connexion valide.
GetObjectOwner & SetObjectOwner (Mth.)
De la forme
Catalog.SetObjectOwner ObjectName, ObjectType , OwnerName [, ObjectTypeId]
Owner = Catalog.GetObjectOwner(ObjectName, ObjectType [, ObjectTypeId])

Permet de renvoyer ou de dfinir le propritaire d'un objet de la base, celui-ci pouvant tre la base de donnes, une
table, un champ.....
Ne fonctionne qu'avec un fichier de scurit dfini.
Les collections
L'objet Catalog renvoie aussi cinq collections qui reprsentent la structure de la base. Nous allons maintenant tudier
ces objets

- 20 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

VIII - Collections de l'objet Catalog


Dans ADOX, les collections ont normalement une proprit Count, et quatre mthodes.Attention le premier index
d'une collection est zro.

VIII-A - Mthodes
VIII-A-1 - Append
Ajoute un objet la collection. La mthode Append est propre chaque collection, aussi allons nous la voir en dtail
plus loin. Notons toutefois qu'un objet cr est librement manipulable, tant qu'il n'a pas t ajout la collection
correspondante. Aprs l'ajout, un certain nombre de proprits passe en lecture seule.

VIII-A-2 - Item
Renvoie un lment d'une collection par son nom ou son index.

VIII-A-3 - Delete
Retire un lment d'une collection. Il faut faire trs attention la suppression de certains lments qui peut mettre
en danger l'intgrit des donnes voire endommager la base

VIII-A-4 - Refresh
Met jour la collection.

VIII-B - Collection tables


Reprsente l'ensemble des tables, au sens large du terme, qui compose la base de donnes. Ces tables peuvent
tre ranges dans les familles suivantes :

Table systme
Table Temporaire
Table de donnes
Vues

En gnrale on ne travaille que sur les tables de donnes l'aide de l'objet Table.

VIII-B-1 - Append
De la forme Cat.Tables.Append NomTable. Lors de la cration tous les objets appartenant la table doivent tre
crs avant l'ajout de celle-ci la collection

VIII-C - Collection Procedures


Reprsente l'ensemble des requtes dfinies dans la base de donnes l'exclusion des requtes non paramtres
renvoyant des enregistrements.

- 21 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

VIII-C-1 - Append
De la forme Cat.Procedures.Append NomRequete, Command. Command reprsente un objet command qui
reprsente la requte.

VIII-D - Collection Views


Reprsente l'ensemble des requtes non paramtres renvoyant des enregistrements. On les retrouve d'une certaine
faon dans la collection Tables avec Access.

VIII-D-1 - Append
De la forme Cat.Views.Append NomRequete, Command. Command reprsente un objet command qui reprsente
la requte.

VIII-E - Collection Groups


Reprsente l'ensemble des groupes dfinis dans la base. A ne pas confondre avec la collection Groups de l'objet
User qui est le groupe auquel appartient un utilisateur.

VIII-E-1 - Append
De la forme Cat.Groups.Append NomGroupe. Ceci reprsente l'ajout d'un groupe la base de donnes. Les
permissions doivent tre dfinies lors de l'ajout du groupe la collection. Le groupe doit tre ajout la collection
avant la cration d'un utilisateur du groupe.

VIII-F - Collection Users


Reprsente l'ensemble des utilisateurs dfinis dans la base. A ne pas confondre avec la collection Users de l'objet
Group qui est l'ensemble des utilisateurs dfinis dans un groupe.

VIII-F-1 - Append
De la forme Cat.Users.Append NomUtilisateur [, MotDePasse]. Ceci reprsente l'ajout d'un utilisateur la base de
donnes.

- 22 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

IX - L'objet Table
Cet objet reprsente une table de la base de donnes. Les tables de type "VIEW" seront vues dans le chapitre du
mme nom. Nous allons donc regarder les tables Standard.
Une table contient des champs (colonnes), des index, des cls et des proprits propres au fournisseur.
Seules deux proprits intressantes sont statiques : "Name" qui reprsente le nom de la table et est obligatoire, et
"type" qui porte bien son nom mais qui est en lecture seule. Ceci fait qu'il n'y a pas de questions existentielles se
poser, lorsqu'on cre une table avec ADOX, elle est forcment standard.
La table n'existe rellement dans la base de donnes que lorsque

Son catalogue est dfini


Elle est ajoute la collection Tables.

Il convient donc de crer entirement la table avant de l'ajouter la collection.

IX-A - Collection Properties


Cette collection n'est utilise que dans le cas des tables lies. N'essayez pas de crer des tables lies en partant du
catalogue de votre base, bien que techniquement possible cela n'est pas conseill. Le code suivant cre une table lie
Sub CreateAttachedJetTable()
Dim Catalogue As ADOX.Catalog, MaTable As ADOX.Table
Set Catalogue = New ADOX.Catalog
Catalogue.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=D:\ADOX
\baseheb.mdb;Jet OLEDB:System database=" & "D:\ADOX\system.mdw;User Id=Admin; Password="
Set MaTable = New ADOX.Table
MaTable.Name = "auteurs"
Set MaTable.ParentCatalog = Catalogue
MaTable.Properties("Jet OLEDB:Create Link") = True
MaTable.Properties("Jet OLEDB:Link Datasource") = "D:\adox\Biblio.mdb"
MaTable.Properties("Jet OLEDB:Link Provider String") = ";Pwd=password"
MaTable.Properties("Jet OLEDB:Remote Table Name") = "auteurs"
Catalogue.Tables.Append MaTable
Set Catalogue = Nothing
End Sub

Lorsque j'cris que c'est dconseill, ce n'est pas d la complexit du code mais pour les deux raisons suivantes :

Il faut s'assurer que le fournisseur utilis pour faire la liaison sera prsent sur le poste qui excute.
Il faut bien savoir si les paramtres de scurit de liaison seront ou ne seront pas stocks de faon
permanente dans la base.

Regardons ce code. Aprs avoir dfini un catalogue nous crons un objet Table. Dans cet exemple, le nom est le
mme que le vrai nom de la table dans l'autre base, mais cela n'a aucune importance. Ensuite je lui attribue un
catalogue afin de pouvoir valoriser ses proprits dynamiques. Notez bien que j'utilise l'objet Catalog de ma base
car je cre une table lie dans ma base.
Je valorise ensuite mes proprits dynamiques, notons que je ne mets pas de fournisseur dans "Jet OLEDB:Link
Provider String" car je continue d'utiliser Jet mais je pourrais tout fait changer le fournisseur. Enfin j'ajoute ma table
la collection. A partir de cet ajout, la table lie est cre mais un certain nombre de ses proprits sont passes
en lecture seule.

- 23 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

IX-B - Collection Columns


Il existe des collections/objets Column pour l'objet Table, Index et Key. Attention de ne
pas les confondre.
La collection Columns regroupe les champs de la table. Elle possde les proprits/mthodes d'une collection
normale.
Append (mth.) : De la forme
Columns.Append Column [, Type] [, DefinedSize]
O Column est l'objet colonne ajouter.

IX-B-1 - Objet Column


Reprsente dans ce cas un champ de la table. A ne pas confondre avec l'objet Column de l'index. Cet objet n'a
pas de mthode.

Proprits
Attributes
Dfini si la colonne est de longueur fixe et si elle accepte les valeurs NULL.
DefinedSize
Dfini la taille maximum du champ
Name
Nom de la table. Obligatoire. L'unicit d'un nom dans une collection n'est pas obligatoire, mais dans une mme base,
il peut pas y avoir deux tables portant le mme nom.
NumericScale
A ne pas confondre avec la proprit Prcision. Donne l'chelle (nombre de chiffre aprs la virgule) d'un champ dont
le type est adNumeric ou adDecimal.
ParentCatalog
Qu'on ne prsente plus!
Precision
Dfini la prcision (nombre maximal de chiffre pour reprsenter la valeur)d'un champ numrique.
Type
Dfini le type du champ. Il existe beaucoup de types dfinis (39) mais le tableau suivant vous donnera les principaux
types Access.

- 24 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

Type
adSmallInt
adInteger
adSingle
adDouble
adCurrency
adDate

Valeur
2
3
4
5
6
7

adBoolean
adUnsignedTinyInt
adGUID
adVarWChar
adLongVarWChar
adLongVarBinary

11
17
72
202
203
205

Commentaire

Type Entier court


Type Entier long (Access)
Valeur dcimale simple prcision
Valeur dcimale double prcision
Type montaire. Utilise normalement 4 chiffres aprs la virgule
Stock comme un double. La partie entire tant le nombre de
jours depuis le 30/12/1899
Boolen
Numrique de type Octet
Par exemple numro de rplication
Chane de caractres (type Text Access)
Champs mmo (Access) et lien hypertexte
Type OLE Object Access

Collection Properties
Les proprits dynamiques de l'objet Column intressantes sont :
Autoincrement : Permet de crer les colonnes numrotation automatique.
Default : Dfinit la valeur par dfaut d'un champ.
Nullable : Dfinit si la colonne accepte des valeurs NULL.
Fixed Length : Dfinit si la colonne est de longueur fixe.
Seed : Dtermine la prochaine valeur qui sera fourni par un champ de type numro Automatique.
Increment : Dfinit le pas d'incrment d'un champ NumroAuto.
Jet OLEDB:Column Validation Text : Dfinit le message d'alerte si une rgle de validation n'est pas respecte.
Jet OLEDB:Column Validation Rule : Dfinit une rgle de validation pour un champ.
Jet OLEDB:Allow Zero Length : Dfinit si les chanes vides sont autorises.

Exemple
Dans l'exemple suivant, nous allons crer une table contenant trois champs, Identification de type NumroAuto, Nom
de type Texte, Ntel de type numrique format.
Dim Catalogue As ADOX.Catalog, MaTable As ADOX.Table
Dim strConn As String, compteur As Long, MaCol As ADOX.Column
Set Catalogue = New ADOX.Catalog
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "D:\User\jmarc\tutorial\ADOX\Test
\NouvBase1.mdb"
Catalogue.Create strConn
Set MaTable = New ADOX.Table
MaTable.Name = "PremTable"
For compteur = 1 To 3
Set MaCol = New ADOX.Column
With MaCol
.DefinedSize = Choose(compteur, 0, 50, 14)
.Name = Choose(compteur, "Id", "Nom", "Tel")
.Type = Choose(compteur, adInteger, adVarWChar, adVarWChar)
- 25 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

.Attributes = Choose(compteur, 0, adColFixed, adColFixed + adColNullable)


If compteur = 1 Then
Set .ParentCatalog = Catalogue
MaCol.Properties("Autoincrement") = True
MaCol.Properties("Seed") = CLng(1)
MaCol.Properties("Increment") = CLng(1)
End If
End With
MaTable.Columns.Append MaCol
Set MaCol=Nothing
Next compteur
Catalogue.Tables.Append MaTable
End Sub

Je commence donc par crer la base de donnes. Pour cela j'utilise une chane de connexion qui est obligatoire pour
pouvoir utiliser la mthode Create de catalogue. Dans cet exemple, je ne dfinis pas de fichier de scurit. Ensuite je
cre mon objet Table. Comme je n'utilise pas sa collection Properties, je ne valorise pas sa proprit ParentCatalog.
Dans la boucle, je cre mes colonnes. J'utilise la fonction Choose afin d'crire de faon plus concise. Pour chaque
colonne je dfinis une taille, un nom, un type et ventuellement ses attributs. Notons que comme la colonne n'est pas
encore ajoute la collection Columns, elle n'existe pas encore. Ds lors, l'ordre de valorisation des proprits n'a
aucune importance. Dans le cas de la colonne "Id" je vais crer un champ NumroAuto. Pour cela, je dois valoriser
des proprits dynamiques, donc je dois dfinir la proprit ParentCatalog. Enfin j'ajoute la colonne la collection
Columns puis la table la collection Tables.
Notez aussi que tous ce code revient au mme, l'exception de la cration de la base que la commande DDL
CREATE TABLE PremTable(Id COUNTER, Nom TEXT 50 NOT NULL, Tel TEXT 14)

IX-C - Collection Indexes


Reprsente les index de la table. Faites bien attention ne pas confondre index et cl. Un index sert augmenter
l'efficacit du SGBDR lors des recherches, de la mise en relation etc....
Normalement devrait toujours tre indexs

Les colonnes composantes d'une cl


Les colonnes ayant des contraintes de validit ou d'unicit
Les colonnes tant la cible de nombreuses recherches.

Les proprits/mthodes de cette collection sont celles des collections standard si ce n'est :
Append
De la forme : Indexes.Append Index [, Columns]
O Columns renvoie le ou les noms des colonnes devant tre indexes. En gnral, on dfinit l'objet colonnes avant
son ajout la collection

IX-C-1 - Objet Index


Cet objet n'a pas de mthodes.
Attention, on ne peut utiliser un objet Column avec cet objet que si la colonne appartient dj la collection Columns
de l'objet Table.

- 26 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

Clustered
Indique si l'index est regroup. Un index regroup signifie qu'il existe un ordre physique pour les donnes. C'est en
gnral l'index de la cl primaire.

IndexNulls
Dfinit le comportement de l'index vis vis des colonnes ayant une valeur NULL.

PrimaryKey
Prcise si l'index reprsente la cl primaire de la table.
NB : C'est l que je vous disais de faire attention. Une cl primaire (ou non d'ailleurs) est dfinie par la collection Keys.
Nanmoins on dfinit en gnral aussi un index sur la colonne de cl primaire. En mettant vrai cette proprit, la
cration de l'index implique la cration de la cl. Donc si vous crez une cl primaire de faon implicite n'essayez
pas de la recrer aprs dans la collection Keys et vice versa.

Unique
Dfinit la contrainte d'unicit.

Collection Properties
Comme toujours, la proprit ParentCatalog de l'index doit tre valoris avant l'appel d'un membre de cette collection.
La plupart de ces proprits tant en lecture seule ou redondante avec les proprits statiques de l'objet, nous n'irons
pas plus avant dans notre exploration.

Collection Columns et objet Column


Dfinit les colonnes sur lesquelles porte l'index. N'oubliez pas qu'un index porte sur un ou plusieurs champs mais
qu'il appartient l'objet Table.
L'objet Column doit imprativement exister dans la table avant de pouvoir tre ajouter la collection Columns de
l'index.
Les colonnes des index utilisent une proprit supplmentaire

SortOrder
Dfinit l'ordre de tri d'une colonne d'index.

Exemple
Dans mon exemple prcdent je vais rajouter un index sur la colonne Nom, avec un tri croissant.
Set MonIndex = New ADOX.Index
With MonIndex
.IndexNulls = adIndexNullsDisallow
.Name = "ind1"
.Columns.Append "Nom"
- 27 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

.Columns("Nom").SortOrder = adSortAscending
End With
MaTable.Indexes.Append MonIndex

Ce code se situe aprs l'ajout des colonnes l'objet Tables mais avant l'ajout de l'objet Table. Comme prcdemment,
je manipule mon objet avant son ajout la collection.
Seules les colonnes indexes supportent l'emploi de la mthode de recherche Seek du
recordset ADO. Celle ci est beaucoup plus performante que la mthode Find.

IX-D - Collection Keys


Nous allons aborder maintenant un des passages un peu "sensibles" de la programmation ADOX, c'est dire les
cls. Les cls sont le fondement de l'intgrit rfrentielle il convient de bien connatre le sujet avant de se lancer
dans leur programmation. Normalement, vous avez travaill sur le modle de donnes avant de construire votre base
donc il suffira de suivre celui-ci.

IX-D-1 - Quelques notions


Les cls sont parfois appeles, improprement d'ailleurs, contraintes. Ceci vient du fait qu'en SQL, Primary Key est
une contrainte. Pourtant si les cls peuvent tre des contraintes, toutes les contraintes ne sont pas des cls.

Cl primaire
Cette cl devrait tre compose d'une seule colonne mais ce n'est pas une obligation. Elle sert identifier chaque
enregistrement de manire unique. La cl primaire n'accepte pas les valeurs NULL. Beaucoup de gens utilisent un
champ numrotation automatique pour dfinir la cl primaire, cela n'est en rien obligatoire. Une table n'a qu'une
cl primaire.

Cl trangre
Champ de mme type/sous-type de donnes que la cl primaire, qu'elle rfrence dans la table enfant. Une table
peut possder plusieurs cls trangres.

Intgrit rfrentielle
Mcanisme de vrification qui s'assure que, pour chaque valeur de cl trangre, il y a une valeur de cl primaire
lui correspondant. Ce mcanisme se dclenche lors de l'ajout d'une nouvelle valeur de cl trangre, lors de la
suppression d'une cl primaire ou lors de la modification de l'une quelconque des deux cls.

Opration en cascade
Mode opratoire dpendant de l'intgrit rfrentielle. Celui-ci dtermine ventuellement le comportement du SGBDR
en cas de suppression/modification d'un enregistrement parent.

IX-D-2 - Mthode Append


De la forme Keys.Append Key [, KeyType] [, Column] [, RelatedTable]
Nous examinerons plus tard le dtail des paramtres (dans les proprits de l'objet Key).

- 28 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

IX-D-3 - Objet Key


Reprsente une cl primaire, trangre ou unique.

DeleteRule
Dfinit les rgles appliquer lors de la suppression d'une valeur de la cl primaire. On distingue 4 cas :
AdRINone
Aucune action (quivalent du mode de gestion SQL ON DELETE NO ACTION). Cette valeur interdit toute suppression
d'un enregistrement tant qu'il existe un enregistrement dpendant dans la base.
AdRICascade
Modifications en cascade (SQL ON DELETE CASCADE). Attention l'utilisation de cette valeur. Elle supprime tous
les enregistrements lis lors de la suppression de l'enregistrement pre. Ceci peut tre trs coteux pour le SGBD
en termes de performances et doit tre limit au sein d'une transaction
AdRISetNull & adRISetDefault
Attribue la valeur nulle ou la valeur par dfaut la cl trangre. Ceci se justifie rarement sauf pour grer des
traitements par lots posteriori.

Name
Tel que son nom l'indique

RelatedTable
Si la cl est une cl trangre, dfinit le nom de la table contenant la cl primaire correspondante.

Type
Dtermine s'il s'agit d'une cl primaire, trangre ou unique. Une cl unique est une cl sans doublons.

UpdateRule
Equivalent pour les modifications DeleteRule pour les mises jour.
Attention de nombreux SGBDR n'acceptent pas toutes les rgles de modification/
suppression. Je vous rappelle aussi que ces rgles s'appliquent sur la cl trangre ; les
dfinir pour la cl primaire ne sert rien.

Collection Columns et objet Column


Dfinit la ou les colonne(s) appartenant la cl. Celles-ci doivent dj appartenir la collection Columns de l'objet
Table. L'objet Column de l'objet Key utilise la proprit RelatedColumn. Celle-ci dfinit la colonne en relation dans
la table dfinie par RelatedTable.

- 29 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

IX-D-4 - Exemple
Nous allons voir maintenant un exemple de cration de cl.
Dim Catalogue As ADOX.Catalog, MaTable As ADOX.Table, compteur As Long
Dim MaCol As ADOX.Column, MaCle As ADOX.Key, MonIndex As ADOX.Index
Set Catalogue = New ADOX.Catalog
'ici se trouve le code prcdemment vu
Set MaCle = New ADOX.Key
With MaCle
.Type = adKeyPrimary
.Name = "ClePrim"
.Columns.Append "Id"
End With
MaTable.Keys.Append MaCle
Set MaCle = Nothing
Catalogue.Tables.Append MaTable
Set MaTable = New ADOX.Table
MaTable.Name = "DeuxTable"
For compteur = 1 To 3
Set MaCol = New ADOX.Column
With MaCol
.DefinedSize = Choose(compteur, 0, 255, 0)
.Name = Choose(compteur, "NumCle", "Local", "Responsable")
.Type = Choose(compteur, adInteger, adVarWChar, adInteger)
Set .ParentCatalog = Catalogue
.Attributes = Choose(compteur, 0, adColFixed, 0)
End With
MaTable.Columns.Append MaCol
Set MaCol = Nothing
Next compteur
For compteur = 1 To 2
Set MonIndex = New ADOX.Index
With MonIndex
.PrimaryKey = Choose(compteur, True, False)
.Unique = Choose(compteur, True, False)
.IndexNulls = adIndexNullsDisallow
.Name = Choose(compteur, "ind21", "Ind22")
.Columns.Append Choose(compteur, "NumCle", "Responsable")
.Columns(Choose(compteur, "NumCle", "Responsable")).SortOrder =
adSortAscending
End With
MaTable.Indexes.Append MonIndex
Set MonIndex = Nothing
Next compteur
Set MaCle = Nothing
Set MaCle = New ADOX.Key
With MaCle
.DeleteRule = adRINone
.UpdateRule = adRINone
.Type = adKeyForeign
.Name = "CleEtr1"
.RelatedTable = "PremTable"
.Columns.Append "Responsable"
.Columns("Responsable").RelatedColumn = "Id"
End With
MaTable.Keys.Append MaCle
Set MaCle = Nothing
Catalogue.Tables.Append MaTable
End Sub

Dans ma premire table je cre une cl primaire de faon explicite. Je lui donne des rgles NO ACTION. Je cre
ensuite une deuxime table contenant trois champs. Le champ "NumCle" quoique n'tant pas de type NumroAuto,
doit tre unique et non NULL. Le champ "Responsable" est la cl trangre et contient la valeur du champ
"Id" correspondant. Ces deux colonnes sont indexes. En jouant sur la proprit PrimaryKey de l'index, je cre
implicitement la cl primaire en crant l'index. Notons que cette cl portera le mme nom que l'index. Je cre ensuite
ma cl trangre et me voil avec deux tables mises en relation.
- 30 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

IX-E - Conclusion sur les tables


Comme nous l'avons vu au cours de ce chapitre, le schma de construction est assez simple. Voici les quelques
rgles se rappeler :

On cre les tables les unes aprs les autres en commenant toujours par les tables parents (celles qui n'ont
pas de cls trangres)
On ajoute un objet sa collection lorsqu'on l'a entirement dfini.
On cre les champs de la table avant de dfinir les index et les cls.
On indexe toujours les champs intervenants dans les jointures et/ou cible de recherche.
La dfinition des cls lors de la cration de la base augmente la scurit des donnes.

- 31 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

X - L'objet Procedure
Cet objet peut reprsenter plusieurs choses selon les cas.

Une requte Action


Une requte paramtre
Une procdure stocke (n'existe pas dans Access)

En soi cet objet est trs simple utiliser puisqu'il ne s'agit que d'un objet Command ayant un nom dans la collection
Procedures. Comme nous avons vu plus haut l'objet Command suffisamment en dtail, nous allons nous pencher
dans ce chapitre sur l'ajout ou la modification de l'objet Procedure.

X-A - Cration d'un objet procdure


Elle se fait en gnrale en utilisant la mthode Append de la collection Procedures de la forme
Catalog.Procedures.Append Name, objCommand
O objCommand est un objet Command. Tout se fait donc dans la dfinition de l'objet Command.
Dans le cas d'une requte action, la cration est facile puisque le texte de la commande est le code SQL. Mais ds
lors qu'il y a utilisation de paramtres il faut faire attention.

X-A-1 - Pas d'objet Parameter


Nous avons vu que pour l'appel des procdures stockes ou des requtes paramtres, nous utilisions les objets
Parameters de la commande. Lors de la cration cela n'est pas possible. La proprit CommandText de l'objet
Command Doit contenir l'ensemble de la requte / procdure telle qu'elle est effectivement crite dans le SGBD.
A part cela, la cration d'un objet Procedure ne pose aucun problme.

Exemple
Dans la suite de mon exemple je peux ajouter
Set MaCommand = New ADODB.Command
MaCommand.CommandText = "PARAMETERS [QuelNom] TEXT(50);SELECT * FROM PremTable WHERE Nom = [QuelNom]"
Catalogue.Procedures.Append "ParNom", MaCommand

Ce code ajoute une requte paramtre nomme "ParNom" attendant le paramtre "QuelNom" de type texte.
Il est tout fait possible de crer une requte action paramtre. Par exemple
PARAMETERS DateCib DateTime, BancCib Text(255);DELETE * FROM tblAnomalie WHERE NumBanc=[BancCib] AND
DatDimanche>=[DateCib];

Est une requte valide.


Attention : Pour les paramtres, il faut bien prciser la taille dans le corps de la
procdure. En effet, si j'avais cris PARAMETERS [QuelNom] TEXT, sans prciser une
taille infrieure ou gale 255 j'aurais cr un paramtre de type mmo au lieu de texte.
- 32 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

(adLongVarWChar au lieu de adVarWChar). Ce genre d'erreur engendre des bugs trs


difficiles voir impossibles retrouver pour les utilisateurs de vos bases de donnes.

X-B - Modification d'un objet Procedure


La modification de l'objet Procdure passe par la modification de l'objet Command sous-jacent. Donc en gnrale on
affecte un objet Command l'objet Command de l'objet Procedure, on modifie le texte et on fait l'opration inverse.
Par exemple :
Set MaCommand = Catalogue.Procedures("ParNom").Command
MaCommand.CommandText = "PARAMETERS [QuelLocal] TEXT(255);SELECT * FROM DeuxTable WHERE Local = [QuelLocal]"
Set Catalogue.Procedures("ParNom").Command = MaCommand

" Mais alors, pourquoi ne pas crire ? "


Catalogue.Procedures("ParNom").Command.CommandText
= "PARAMETERS [QuelLocal] TEXT(255);SELECT * FROM DeuxTable WHERE Local = [QuelLocal]"

La raison est la suivante :


Intrinsquement, un objet Command est volatile, c'est dire qu'il n'est pas li la base de donnes ( contrario des
objets DAO QueryDefs). Si nous utilisions le code ci-dessus, la procdure se comporterait comme attendu au cours
de la mme session de programme mais les modifications ne seraient pas enregistres dans la base de donnes
et ces modifications seraient perdues. C'est pourquoi il convient de raffecter explicitement un objet Command
l'objet Procedure.

- 33 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

XI - L'objet View
La cration et la modification d'un objet View se gre de la mme manire que pour les objets Procedure. C'est
pourquoi nous ne nous rditerons pas ces notions ici.
Il faut cependant savoir que la seule vraie diffrence existant entre l'Objet Procdure et l'objet View sont que ce
dernier n'accepte que des requtes Select sans paramtre.

XI-A - Conclusion sur les objets View & Procedure


Ces deux objets ne prsentent aucune difficult majeure programmer si ce n'est de faire attention toujours affecter
les objets Command de faon explicite.
Dans le cas des requtes renvoyant des enregistrements (View ou Procedure) on peut directement valoriser un
recordset avec.
Ne perdez pas de temps paramtrer l'objet Command lors de la cration de requte ou de procdure, seule la
proprit CommandText compte.
Pour se finir voil un code qui permet de rcuprer l'ensemble des requtes / procdures de la base de donnes
sous leurs formes SQL.
Private Sub Command1_Click()
Dim cnn1 As ADODB.Connection
Dim Catalogue As ADOX.Catalog, fso As New FileSystemObject
Dim Fich As TextStream, MaCmd As ADODB.Command
Dim MaProc As ADOX.Procedure, MaVue As ADOX.View
Set Fich = fso.CreateTextFile("d:\recupTexte.txt", True)
Set Catalogue = New ADOX.Catalog
Set cnn1 = New ADODB.Connection
With cnn1
.Provider = "Microsoft.Jet.OLEDB.4.0;"
.ConnectionTimeout = 30
.CursorLocation = adUseClient
.IsolationLevel = adXactChaos
.Mode = adModeShareExclusive
.Properties("Jet OLEDB:System database") =
"D:\User\jmarc\tutorial\ADOX\system.mdw"
.Open "Data Source=D:\User\jmarc\tutorial\ADOX\baseheb.mdb ;User
Id=Admin; Password="
End With
Catalogue.ActiveConnection = cnn1
For Each MaProc In Catalogue.Procedures
Fich.WriteLine "NOUVELLE PROCEDURE"
Fich.WriteLine "Nom = " & MaProc.Name
Set MaCmd = MaProc.Command
Fich.WriteLine MaCmd.CommandText
Next
For Each MaVue In Catalogue.Views
Fich.WriteLine "NOUVELLE VUE"
Fich.WriteLine "Nom = " & MaVue.Name
Set MaCmd = MaVue.Command
Fich.WriteLine MaCmd.CommandText
Next
Fich.Close
End Sub

Voil vous savez maintenant crer par le code une base de donnes, nous allons attaquer une partie beaucoup plus
complexe, mais nanmoins essentielle, la gestion des utilisateurs.

- 34 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

XII - Gestion des utilisateurs


La gestion des utilisateurs comprend en fait de faon imbrique deux thmes que sont les droits d'accs et la proprit.
Quasiment tous les SGBD disposent d'un systme limitant l'accs au donnes ainsi qu' la structure de la base. Avec
ADOX on retrouve ces concepts dans les objets User et Group.

XII-A - Cas particulier d'Access


Les concepts que nous allons voir plus loin fonctionnent pour de nombreux SGBD mais Access gre la scurit
utilisateur par l'utilisation d'un fichier externe. Ceci prsente des avantages et des inconvnients mais je ne vais pas
dmarrer une polmique ici.
Si j'aborde ce point c'est pour une particularit d'Access. Pour garantir l'unicit de chaque utilisateur ou groupe, le
fichier de scurit Access utilise un identifiant Unique nomm SID qui est gnr l'aide du nom de l'utilisateur (ou
du groupe) et d'une chane nomme PID. Un mme nom avec un mme PID gnre toujours le mme SID ce qui
permet de reconstruire le fichier de scurit si besoin est.
Si cette possibilit existe avec DAO, ADO ne permet pas de fournir un PID explicite ce qui rend le fichier impossible
reconstruire en cas de problme. Certes des sauvegardes frquentes doivent pouvoir viter ce problme mais c'tait
une perte de souplesse importante.
De mme, normalement un utilisateur hrite implicitement des droits d'accs du groupe, mais cela n'est pas le cas
avec ADO 2.7 et infrieur. Il faut alors coder explicitement les droits du groupe et de l'utilisateur.
Comme Access gre sa scurit par un fichier externe, il est fortement conseill de spcifier ce fichier dans la
connexion du catalogue avec la Property ("Jet OLEDB:System database") et ventuellement la cration d'un nouveau
fichier avec la Property (Jet OLEDB:Create System Database)
Si vous spcifiez un fichier de scurit incorrecte, vous n'aurez pas d'erreur lors de
l'ouverture du catalogue. L'erreur surviendra lors de l'appel d'un objet li la scurit. De
plus vous obtiendrez une erreur 3251 " L'opration demande par l'application n'est pas
prise en charge par le fournisseur." ce qui ne vous aidera pas beaucoup voir l'erreur.

XII-B - Proprits et droits


Voil deux notions importantes, corrlatives et pourtant diffrentes dans leur conception.

XII-B-1 - Propritaire
Chaque objet a toujours un propritaire. A l'origine, c'est le crateur de l'objet qui est le propritaire.
Le propritaire d'un objet garde le droit d'accs total (modification, suppression, droits) sur l'objet. Le propritaire
d'un objet peut tre un utilisateur ou un groupe. La base de donnes est un objet un peu particulier puisque seul un
utilisateur (et non un groupe) peut en tre propritaire.
Le problme de la gestion de la proprit est important grer si les utilisateurs ont le droit de crer des objets. Si
vous souhaitez qu'ils gardent tous les droits sur les objets qu'ils ont crs, il n'y a rien faire, mais sinon vous devez
grer le transfert de la proprit.
Faites toujours trs attention cette notion de propritaire, elle peut permettre des accs que vous ne souhaiteriez
pas si vous n'y prenez pas garde.

- 35 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

XII-B-2 - Administrateur
Habituellement, l'administrateur ou les membres du groupe administrateur sont les seuls avoir tous les droits sur
une base de donnes, y compris celui de modifier les droits d'accs des autres. De part ce fait, on essaye toujours de
limiter le nombre d'administrateurs. Pour ce faire, il faut donc mettre au point une stratgie de droits pour que chaque
groupe ait les droits ncessaires et suffisants un bon fonctionnement. L'avantage dans ce cas d'une approche par
programme est la possibilit d'utiliser une connexion ayant les droits administrateurs pour permettre aux utilisateurs
de faire des actions (prvues) que leurs droits ne leurs permettraient pas de faire normalement.

XII-B-2-a - Access
Mme si cela est transparent, la scurit d'Access est toujours active. Il existe un compte "Administrateur" possdant
tous les droits et n'ayant pas de mot de passe. Pour activer la scurit sur Access on procde en gnral de la
manire suivante :

On donne un mot de passe l'utilisateur "Administrateur".


On cre un nouveau compte d'administrateur, avec un autre nom de prfrence ("Admin" par exemple)
auquel on donne tous les droits et proprits
On supprime le compte "Administrateur" du groupe "Administrateurs". Il n'est en effet pas possible de
supprimer les Groupes et Utilisateurs par dfaut.

La dernire tape n'est pas indispensable, par contre la premire l'est, car sans cela, n'importe qui ayant Access sur
son poste pourra ouvrir votre base de donnes.

XII-B-3 - Utilisateurs et groupes


C'est une notion classique de la scurit des SGBD. Un groupe reprsente l'ensemble des utilisateurs possdant les
mmes droits. Un utilisateur reprsente en gnrale une personne.
Chaque utilisateur appartient au minimum au groupe des utilisateurs, mais il peut appartenir plusieurs groupes.
Un utilisateur hrite toujours des droits du(des) groupe(s) dont il dpend, mais peut avoir des droits modifis par
rapport celui-ci. Attention, en cas de contradiction entre les droits du groupe et ceux de l'utilisateur, c'est toujours
la condition la moins restrictive qui l'emporte.
Pour simplifier la gestion des droits, on dfinit habituellement les groupes puis les utilisateurs.
Lorsqu'un groupe est propritaire, chaque utilisateur du groupe est galement propritaire.
L'hritage des droits d'un groupe est paramtrable.

XII-B-4 - Hritage des objets


Les droits d'un groupe / utilisateur se dfinissent normalement pour chaque objet.
Pour une base de donnes contenant de multiples objets, vous voyez immdiatement le code que cela peut
engendrer. Il est possible de propager les droits d'un objet tous les objets que celui-ci contient. Une solution consiste
donc donner des restrictions standards l'objet base de donnes puis adapter au cas par cas sur les objets.
Attention, cette mthode n'est pas rversible, elle n'est donc pas sans risque. Cet hritage n'est jamais transverse,
mais il est possible de dfinir des droits pour une catgorie gnrique d'objet.

- 36 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

XII-C - Objet Group


En soit un objet Group n'est pas trs complexe. Il ne possde que la collection Users qui reprsente les utilisateurs
membres du groupe, une proprit Name qui est son nom et deux mthodes. C'est celles-ci que nous allons voir
en dtails.

XII-C-1 - SetPermissions
Attribue les permissions sur un objet pour un groupe ou un utilisateur. De la forme
Group.SetPermissions Name, ObjectType, Action, Rights [, Inherit] [, ObjectTypeId]
Il s'agit l d'une mthode. Contrairement la valorisation des proprits ADOX qui se fait
avant l'ajout de l'objet la collection, on applique les mthodes l'objet seulement aprs
son ajout la collection.
Passons en revue ces paramtres, mais notez bien qu'il s'appliquent aussi bien au groupe qu' l'utilisateur. Les
diffrences seront vues dans l'tude de l'objet User.

ObjectType
Le paramtre ObjectType peut prendre une des valeurs suivantes :
Constante
adPermObjProviderSpecific
adPermObjTable
adPermObjColumn
adPermObjDatabase
adPermObjProcedure
AdPermObjView

Valeur
-1
1
2
3
4
5

Description
Dfini un objet spcifique du fournisseur..
Une erreur se produira si le paramtre
ObjectTypeId n'est pas fourni
Objet Table.
objet Column
L'objet est la base de donnes
Objet Procedure.
Objet View

On retrouve la tous les objets du modle plus l'objet Database. La valeur adPermObjProviderSpecific permet d'utiliser
des objets spcifiques au fournisseur, par exemple pour Access les tats ou les formulaires.

Name
Donne le nom de l'objet cible, si vous ne prcisez pas ce nom vous devez passer NULL mais vous aurez une erreur
si vous omettez le paramtre. Dans ce cas, les droits seront attribus tous les nouveaux objets de mme type
contenu dans le catalogue (catgorie gnrique).
Pour l'objet database, vous devez donner une chane vide ("") au paramtre Name. Voir dans l'exemple plus loin.

Action
Ce paramtre est combin avec le paramtre Rights. Il peut prendre les valeurs suivantes :

- 37 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

Constante
adAccessGrant

Valeur
1

adAccessSet

adAccessDeny

adAccessRevoke

Description
Le groupe aura au moins les autorisations
demandes.
Le groupe aura exactement les autorisations
demandes
Le groupe n'aura pas les autorisations
demandes.
Tous les droits d'accs explicites que
possdent le groupe seront annuls.

Dtaillons ces valeurs car elles dpendent fortement de la stratgie choisie ainsi que de la gestion de l'existant.
Lorsque l'on considre un utilisateur, on entend par droits (autorisations) explicites, les droits qui appartiennent
celui-ci et par droits implicites les droits de son groupe. Pour un groupe, tous les droits sont explicites.
adAccessRevoke retire donc tous les droits du groupe, il n'est pas utile de renseigner le paramtre Rights
(videmment). Le fait de retirer les droits d'un groupe ne retire pas les droits d'un utilisateur appartenant au groupe
lorsqu'ils sont diffrents de ceux du groupe.
adAccessDeny enlve tous les droits dfinis dans le paramtre Rights.
adAccessSet est la valeur que l'on utilise en gnral lors de la cration du fichier de scurit. Les droits dfinis dans le
paramtre Rights seront exactement les droits donns, ceux existant prcdemment seront remplacs ou modifis.
AdAccessGrant est la valeur pour la modification de droits. Au lieu de redfinir toute la liste des droits on prcise le
droit que l'on souhaite modifier, les autres droits ne seront pas redfinis.

Rights
Valeur de type Long reprsentant un masque binaire des droits pouvant tre une ou plusieurs des valeurs suivantes.
Certaines de ces valeurs sont exclusives (adRightFull par exemple) :

- 38 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

Constante
adRightCreate

Valeur
Description
16384 (&H4000) Le groupe l'autorisation de crer des objets de
ce type
adRightDelete
65536
Le groupe a l'autorisation de supprimer des
(&H10000)
donnes de l'objet
adRightDrop
256 (&H100)
Le groupe a l'autorisation de supprimer l'objet
adRightExclusive
512 (&H200)
Le groupe a l'autorisation d'accder de faon
exclusive l'objet
adRightExecute
536870912
Le groupe a l'autorisation d'excuter l'objet.
(&H20000000)
(macro Access par exemple)
adRightFull
268435456
Le groupe a toutes les autorisations concernant
(&H10000000)
l'objet
adRightInsert
32768 (&H8000) Le groupe a l'autorisation d'insrer des donnes
dans l'objet.
adRightMaximumAllowed
33554432
Le groupe a le maximum d'autorisations
(&H2000000)
spcifiques autorises par le fournisseur.
adRightNone
0
Le groupe n'a aucune autorisations concernant
l'objet.
adRightRead
-2147483648
Le groupe a l'autorisation de lire l'objet
(&H80000000)
adRightReadDesign 1024 (&H400)
Le groupe a l'autorisation de lire la dfinition de
l'objet
adRightReadPermissions
131072
Le groupe a l'autorisation de lire les autorisations
(&H20000)
de l'objet
adRightReference
8192 (&H2000) Le groupe a l'autorisation de rfrencer l'objet
adRightUpdate
1073741824
Le groupe a l'autorisation de modifier des
(&H40000000)
donnes dans l'objet.
adRightWithGrant
4096 (&H1000) Le groupe a l'autorisation d'accorder des
autorisations concernant l'objet
adRightWriteDesign 2048 (&H800)
Le groupe a l'autorisation de modifier la structure
de l'objet
adRightWriteOwner
524288
Le groupe a l'autorisation de modifier le
(&H80000)
propritaire de l'objet
adRightWritePermissions
262144
Le groupe a l'autorisation de modifier des
(&H40000)
autorisations spcifiques de l'objet.
Comme il s'agit de masque binaire, on compose les droits avec l'oprateur "OR".
Une erreur frquente consiste considrer l'attribution des droits par programmation comme fonctionnant l'identique
de l'assistant scurit. Celui-ci cre implicitement des droits lorsque l'on attribue certains droits l'utilisateur (par
exemple l'autorisation "modifier les donnes" donne automatiquement l'autorisation "lire les donnes"). Il n'en est pas
de mme par programmation. Vous devez dfinir de faon cohrente et explicite les droits sous peine de bloquer
vos utilisateurs.
Une autre erreur consiste utiliser un droit qui n'existe pas pour l'objet considr. Ainsi j'ai dj vu donner le droit
adRightExecute sur des procdures, srement parce que l'on dit excuter une requte, alors que c'est le droit
adRightRead qu'il faut utiliser.

Inherit
Paramtre optionnel qui dtermine comment les objets contenus dans l'objet cible hriteront des autorisations. Les
valeurs peuvent tre :

- 39 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

Constante
adInheritNone
adInheritObjects

Valeur
0
1

adInheritContainers

adInheritBoth
adInheritNoPropagate

3
4

Description
Valeur par dfaut. Pas d'hritage.
Les objets non-conteneurs hritent des
autorisations.
Les objets conteneurs hritent des
autorisations.
Tous les objets hritent des autorisations.
Les objets n'ayant pas dj hrits
d'autorisations hriteront.

L'hritage a parfois des rsultats surprenants avec ADOX, je vous conseille donc de ne pas en abuser. Toutefois on
peut toujours dterminer une configuration type par groupe et la donner la base de donnes avec un hritage, afin
que les objets contenus hritent des autorisations. Je ne vous conseille pas d'utiliser cette technique.

ObjectTypeId
Ce paramtre est obligatoire avec le type adPermObjProviderSpecific. Cela permet d'accder certains objets
contenus dans le SGBD. Il faut passer comme valeur le GUID de l'objet. Par exemple pour Access les GUIDs suivants
permettent de dfinir des autorisations pour les formulaires, tats et macro
Object
Form
Report
Macro

GUID
{c49c842e-9dcb-11d1-9f0a-00c04fc2c2e0}
{c49c8430-9dcb-11d1-9f0a-00c04fc2c2e0}
{c49c842f-9dcb-11d1-9f0a-00c04fc2c2e0}

XII-C-2 - GetPermissions
Permet de lire les autorisations d'accs d'un objet. Ce n'est pas toujours trs simple interprter par programmation,
aussi je vous conseille plutt de supprimer puis de recrer les autorisations.
De la forme
ReturnValue = Group.GetPermissions(Name, ObjectType [, ObjectTypeId])
Ou ReturnValue est une valeur de type Long reprsentant le masque binaire. Pour tester si une autorisations existe
dans le masque utiliser l'oprateur AND
La fonction suivante permet d'afficher les droits dans la fentre d'excution.
Private Sub EcrisDroit(Droits As Long)
If
If
If
If
If
If
If
If
If
If
If
If
If
If
End

Droits
Droits
Droits
Droits
Droits
Droits
Droits
Droits
Droits
Droits
Droits
Droits
Droits
Droits
Sub

And
And
And
And
And
And
And
And
And
And
And
And
And
And

adRightCreate Then Debug.Print "Cration"


adRightDelete Then Debug.Print "Effacement"
adRightDrop Then Debug.Print "Suppression"
adRightExclusive Then Debug.Print "Exclusif"
adRightExecute Then Debug.Print "Excution"
adRightInsert Then Debug.Print "Insertion"
adRightRead Then Debug.Print "Lecture D"
adRightReadDesign Then Debug.Print "Lecture S"
adRightReadPermissions Then Debug.Print "LirePermission"
adRightReference Then Debug.Print "Reference"
adRightUpdate Then Debug.Print "Modification"
adRightWithGrant Then Debug.Print "ModifPermission"
adRightWriteDesign Then Debug.Print "Modif Structure"
adRightWriteOwner Then Debug.Print "Modif Prop"

- 40 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

Avec un appel de procdure comme :


temp = MonGrou.GetPermissions("tblAnomalie", adPermObjTable)
Call EcrisDroit(temp)

XII-D - Objet User


Cet objet ressemble fortement l'objet Group dans sa programmation. Il possde une mthode de plus.

XII-D-1 - ChangePassword
Permet de modifier le mot de passe d'un utilisateur.
User.ChangePassword OldPassword, NewPassword
L pas besoin d'explication si ce n'est qu'un des paramtres peut tre la chane vide ""

XII-D-2 - GetPermissions & SetPermissions


S'utilise comme pour l'objet Group.
Comme je l'ai dj dit un utilisateur membre d'un groupe peut avoir des autorisations diffrentes de celles du groupe.
Pour des raisons de maintenance, cette situation est toutefois proscrire. N'oubliez pas que sur un mlange de
proprits utilisateur / groupe c'est toujours l'autorisation la moins restrictive qui l'emporte.

XII-D-3 - Properties
Les objets User et Group ont une collection properties.

XII-E - Exemple
Dans l'exemple suivant nous allons scuriser une base de donnes, crer deux groupes et deux utilisateurs.
En phase de cration de base, commencez toujours par grer la scurit comme vous allez le voir c'est beaucoup
plus simple.
Dim Catalogue As ADOX.Catalog, MonGrou As ADOX.Group, strconn As String
Set Catalogue = New ADOX.Catalog
strconn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
"D:\User\jmarc\tutorial\ADOX\Test\NouvBase1.mdb" & ";Jet OLEDB:System
database = D:\User\jmarc\tutorial\ADOX\system.mdw;User Id=Admin; Password="
Catalogue.Create strconn
Catalogue.Users("Admin").ChangePassword "", "password"
Catalogue.Groups.Append "Utilisateurs"
Set MonGrou = Catalogue.Groups("Utilisateurs")
With MonGrou
.SetPermissions "", adPermObjDatabase, adAccessSet, adRightRead,adInheritNone
.SetPermissions Null, adPermObjTable, adAccessSet, adRightInsert Or adRightRead Or adRightUpdate,
adInheritNone
.SetPermissions Null, adPermObjProcedure, adAccessSet, adRightRead Or adRightReadDesign,
adInheritNone
.SetPermissions Null, adPermObjView, adAccessSet, adRightRead Or adRightReadDesign, adInheritNone
End With
Catalogue.Groups.Append "Consultants"
Set MonGrou = Catalogue.Groups("Consultants")
With MonGrou
.SetPermissions "", adPermObjDatabase, adAccessSet, adRightNone,adInheritNone
- 41 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

.SetPermissions Null, adPermObjTable, adAccessSet, adRightNone,adInheritNone


.SetPermissions Null, adPermObjProcedure, adAccessSet, adRightNone,adInheritNone
.SetPermissions Null, adPermObjView, adAccessSet, adRightRead,adInheritNone
End With
Catalogue.Users.Append "Emile", ""
Catalogue.Users("Emile").ChangePassword "", "xtf22re"
Catalogue.Groups("Utilisateurs").Users.Append "Emile"
With Catalogue.Users("Emile")
.SetPermissions "", adPermObjDatabase, adAccessSet, adRightRead,adInheritNone
.SetPermissions Null, adPermObjTable, adAccessSet, adRightInsert Or adRightRead Or adRightUpdate,
adInheritNone
.SetPermissions Null, adPermObjProcedure, adAccessSet, adRightRead Or adRightReadDesign,
adInheritNone
.SetPermissions Null, adPermObjView, adAccessSet, adRightRead Or adRightReadDesign, adInheritNone
End With
Catalogue.Users.Append "Leon", ""
Catalogue.Users("Leon").ChangePassword "", "pwed58t"
Catalogue.Groups("Consultants").Users.Append "Leon"
With Catalogue.Users("Leon")
.SetPermissions "", adPermObjDatabase, adAccessSet, adRightNone, adInheritNone
.SetPermissions Null, adPermObjTable, adAccessSet, adRightNone, adInheritNone
.SetPermissions Null, adPermObjProcedure, adAccessSet, adRightNone, adInheritNone
.SetPermissions Null, adPermObjView, adAccessSet, adRightRead, adInheritNone
End With

Comme nous le voyons, la premire tape aprs la cration est de changer le mot de passe de l'administrateur afin
d'activer la scurit.
Je cre ensuite deux groupes dont je dfinis les droits puis deux utilisateurs (1 par groupe). Notez que je redfinis
les mmes droits puisque ADO avec Access ne gnre pas l'hritage implicite des droits du groupe.
Dans ce cas, je n'ai encore cr aucun objet dans ma table. Ceci me permet d'utiliser des catgories gnriques
pour l'attribution des droits (utilisation de Null pour le paramtre Name).
Vous remarquerez enfin que j'utilise SetPermissions aprs l'ajout de l'objet sa collection

XII-F - Techniques de scurisation


Il est bien vident que grer la scurit par le code n'est pas une sincure, aussi on essaye toujours de passer par
les assistants ad hoc des SGBD plutt que de se lancer dans un code aventureux.
Dans le cas d'Access, il est beaucoup plus parlant de grer les scurits depuis Access. Si toutefois vous devez
utiliser le code, vous gagnerez en efficacit et en simplicit suivre le modle DAO pour grer la scurit, du moins
tant que Microsoft n'aura pas sorti une version ADO faisant cela efficacement.
Nous allons partir du principe dans cette partie que l'emploi du code avec ADO est indispensable.
Grosso modo il n'existe que deux cas, soit vous allez modifier des groupes, des utilisateurs ou des autorisations
existantes soit il vous faut tout crer.

XII-F-1 - Modification
Si la scurit est dj bien gre, il ne s'agit que d'ajouter des utilisateurs et de bien grer les droits d'accs ou
de proprit. La technique consiste toujours crer un utilisateur dans un groupe existant, afin de ne pas avoir
grer tous ses droits objet par objet. Lors de la modification d'autorisations, il est souvent plus simple de dtruire
les anciennes, puis de r attribuer les autorisations. Cherchez toujours donner la proprit des nouveaux objets
l'administrateur ou alors crez un utilisateur fantme, appels par exemple "Code", qui possde les autorisations
ncessaires tous vos accs par le code.

- 42 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

Si la scurit est mal gre, dtruisez tout et repartez du dbut.


Le code suivant vous donne un exemple de la r attribution de la proprit des tables.
Private Sub Command9_Click()
Dim cnn1 As ADODB.Connection
Dim Catalogue As ADOX.Catalog, MaTable As ADOX.Table
Set Catalogue = New ADOX.Catalog
Set cnn1 = New ADODB.Connection
With cnn1
.Provider = "Microsoft.Jet.OLEDB.4.0;"
.ConnectionTimeout = 30
.CursorLocation = adUseClient
.IsolationLevel = adXactChaos
.Mode = adModeShareExclusive
.Properties("Jet OLEDB:System database") = "D:\User\jmarc\tutorial\ADOX\system.mdw"
.Open "Data Source=D:\User\jmarc\tutorial\ADOX\Test
\NouvBase1.mdb ;User Id=Admin; Password=password"
End With
Catalogue.ActiveConnection = cnn1
For Each MaTable In Catalogue.Tables
If StrComp(Catalogue.GetObjectOwner(MaTable.Name, adPermObjTable), "admin",
vbTextCompare) <> 0 And StrComp(Catalogue.GetObjectOwner(MaTable.Name, adPermObjTable), "engine",
vbTextCompare) &lt;> 0 Then
Catalogue.SetObjectOwner MaTable.Name, adPermObjTable, "Admin"
End If
Next
End Sub

Comme vous le voyez dans le test, n'essayez pas de prendre la proprit des tables dont le propritaire est
"engine" (information de schma du moteur Jet) vous dclencheriez une erreur.

XII-F-2 - Cration
Lors de la cration de la base, je vous conseille vivement de crer la scurit en premier. Vous pouvez ds lors utiliser
des objets gnriques et dfinir vos droits assez rapidement. Il vaut toujours mieux avoir un groupe de trop que l'on
supprime la fin, plutt que de se rendre compte qu'il en manque un.
Dfinissez votre systme de scurit avant de coder. Par le code il vaut mieux multiplier les groupes que les
utilisateurs.

XII-F-3 - Une autre solution : le DDL


A partir d'Access 2000, vous pouvez contourner les faiblesses de ADO pour la cration des utilisateurs et des groupes
en utilisant le DDL. Sachez que celui vous permet de grer les PID.
Un objet Command peut tre utilis avec une requte de type :
CREATE USER Nom MotDePasse PID
Mais nous sortons l du cadre de cet article

- 43 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

XII-G - Conclusion sur la scurit


Comme nous l'avons vu, grer la scurit par le code n'est souvent pas un bon choix. Cela reste possible faire
dans certains cas particulier mais le code est relativement lourd et dur corriger. Privilgiez toujours la solution des
assistants tant que cela est possible.
Bien que je n'ai pas abord cela, vous aurez une erreur si l'utilisateur qui se connecte n'a pas les droits d'criture
de structure et tente d'ouvrir le catalogue.
Ce catalogue peut tre partiel en fonction des droits dfinis.

- 44 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/

Utiliser le modle ADOX avec Visual Basic par Jean-Marc Rabilloud

XIII - Conclusion
Voil nous avons parcouru le modle objet ADOX dans son ensemble. Gardez bien en mmoire que celui-ci est fait
pour intervenir sur la structure, pas seulement pour la lire, dans ce cas privilgiez OpenSchema.
Le modle en lui-mme est assez simple, mais pour pouvoir l'utiliser de faon approfondie vous devez tudier
correctement votre fournisseur.
Bonne programmation.

XIII-A - Remerciements
J'adresse ici tous mes remerciements l'quipe de rdaction de "developpez.com" et tout particulirement Etienne
Bar, Sbastien Curutchet, Maxence Hubiche et Romain Puyfoulhoux pour le temps qu'ils ont bien voulu passer la
correction et l'amlioration de cet article.

- 45 Copyright 2003 bidou. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://vb.developpez.com/bidou/adox/