Composants de la palette BDE - Accès à une base de données ACCESS

Ricky81

Ce tutoriel décrit brièvement les composants principaux de la palette BDE sous Borland C++ Builder 6 et propose d'illustrer l'utilisation de ces composants par 2 études de cas portant sur l'établissement d'une connexion à une base de données Access à l'aide du BDE.

- Titre : Composants de la palette BDE - Accès à une base de données ACCESS

- Auteur : Ricky81

- Parution : 14 avril 2004

- Mise à jour : 4 septembre 2004

- Licence : Copyright ® 2004 Ricky81. Aucune reproduction, même 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 intérêts.

Sommaire

- Préambule

- Avant-propos

- Remerciements

- 1. Les composants de la palette BDE

- 1-1. TSession

- 1-1-1. Configuration

- 1-1-2. Utilisation

- 1-2. TDatabase

- 1-2-1. Utilisation d'un alias

- 1-2-2. Utilisation d'un pilote

- 1-2-3. Configuration

- 1-2-4. Utilisation

- 1-3. TTable

- 1-4. TQuery

- 2. Quelques éléments prérequis aux études de cas

- 2-1. Les différents types de pilotes et Access

- 2-2. Prérequis

- 3. Etude de cas en ODBC

- 3-1. Quelques mots sur le DSN

- 3-2. Création d'un DSN

- 3-3. Paramétrage des composants

- 4. Etude de cas en natif

- 4-1. Edition du pilote natif

- 4-2. Paramétrage des composants

- 5. Exemples d'utilisation de composants du BDE

- 5-1. Affichage du contenu d'une table

- 5-1-1. Les composants à ajouter

- 5-1-2. Affichage du contenu de la table ETUDIANT

- 5-2. Exécution d'une requête

- 5-2-1. Les composants à ajouter

- 5-2-2. La requête à exécuter

- 5-2-3. Exécution de la requête et affichage

- 5-3. Le fichier ACCESS utilisé

Préambule

Avant-propos

Travaillant sous C++ Builder Professionnel 6.0 en version française, les éventuelles références (nom de menus, options, ...) seront relatives à cette version.

Le but de ce tutoriel n'est pas de décrire de façon exhaustive les composants de la palette BDE, il se concentre sur l'ensemble des prérogatives à une manipulation de base de données ACCESS, dont la manipulation pose souvent des problèmes aux débutants. De plus, bien que l'utilisation du BDE ne soit à priori plus d'actualité, des développements (ainsi que leur maintenance) semblent encore être faits en se basant sur le Borland Database Engine.

Ce tutoriel se veut donc formateur, j'espère donc que les explications qui vont suivre seront claires. Dans le cas contraire, je suis ouvert à toute critique ou remarque constructives ainsi qu'à des propositions d'enrichissement du tutoriel.
Merci de privilégier les forums pour vos questions sur le sujet.

Remerciements

Je tiens avant tout à remercier Demco pour la relecture, ainsi que les membres de la section C/C++ pour leurs remarques et conseils.

1 - Les composants de la palette BDE

La description qui suit se limite aux composants les plus utilisés et primordiaux pour gérer l'accès à une base de données.

1-1 - TSession

Le composant TSession permet de définir les propriétés de la communication entre votre application et la base de données cible. Pour toute application de base de données, une session par défaut est créée, et il est donc possible d'utiliser ce composant comme support de la connexion. Néanmoins, il me semble plus propre de définir son propre composant TSession, d'autant plus si on est amené à en définir certaines propriétés.

La session permet notamment de gérer un alias BDE dans lequel on retrouve les configurations de connexion possibles. Davantage d'informations sur ce composant sont disponibles dans l'aide.

1-1-1 - Configuration

La configuration de base est très légère, il suffit pour l'instant de déposer un composant TSession sur la fiche et de remplir les propriétés Name (nom du composant) et SessionName (identifiant de la session).

1-1-2 - Utilisation

Pour activer ou désactiver la session, il convient d'utiliser les méthodes Open et Close ou directement modifier la propriété Active.

1-2 - TDatabase

Le composant TDatabase est spécifique à l'accès à un serveur de base de données (il n'est donc pas utile dans le cas de Paradox puisqu'on peut directement accéder aux tables), ce qui est le cas pour ACCESS puisqu'on a un seul fichier contenant les différentes tables qu'on souhaite manipuler.

Il s'appuie sur une session (propriété SessionName) et peut donc accéder à l'ensemble des alias disponibles dans le BDE ainsi qu'aux pilotes proposés par le BDE (propriétés AliasName et DriverName).

L'évocation de ces propriétés est l'occasion de décrire les 2 configurations types possibles pour un composant TDatabase.

1-2-1 - Utilisation d'un alias

Ceci est la manière la plus simple de gérer sa connexion à une base de données puisque la configuration est en grande partie déportée vers le module d'administration du BDE. Il "suffit" de configurer son alias correctement dans le module d'administration et de sélectionner l'alias (propriété AliasName) correspondant au niveau du composant TDatabase.

Il y a donc toute une phase de configuration et de tests de validité de l'alias à faire avant de se lancer dans le codage de son application. Je reviendrai dans l'étude de cas sur un exemple de configuration d'alias dans le BDE.

1-2-2 - Utilisation d'un pilote

Il est également possible d'établir une liaison avec une base de données en précisant le pilote à utiliser (propriété DriverName). Bien entendu, cela ne suffit pas pour pouvoir accéder à votre base de données (l'application a évidemment besoin de savoir où la base de données est située) et la propriété Params permet de définir les principales caractéristiques de votre base de données (nom, mode d'ouverture, ...).

1-2-3 - Configuration

Nous avons donc vu que les propriétés AliasName et (DriverName + Params) sont à la base de la configuration du composant TDatabase (il n'est bien entendu pas possible de combiner ces propriétés). En ce qui concerne les autres propriétés, il convient bien entendu de sélectionner la session utilisée (propriété SessionName), de nommer le composant (Name) et de donner un identifiant pour le référencer au niveau des composants d'accès et de manipulation de la base de données (DatabaseName).

1-2-4 - Utilisation

Comme pour le composant TSession, il existe une propriété permettant de connaître l'état de la connexion avec la base de données. La connexion/déconnexion peut se faire par modification de cette propriété mais on privilégiera les méthodes Open et Close (plus explicites et évitant des erreurs idiotes).

1-3 - TTable

Le composant TTable permet d'accéder à une table.

Pour l'utiliser, il suffit de définir les propriétés suivantes : DatabaseName (nom du composant TDatabase) et SessionName. Si les composants (et notamment les alias et/ou pilotes) sont bien définis, il sera possible de sélectionner la table dans l'explorateur de classe (TableName).

La connexion/déconnexion à la table se fait par l'intermédiaire des méthodes Open et Close.

1-4 - TQuery

Le composant TQuery permet d'exécuter une requête SQL sur un ensemble de données contenu dans la base de données. Il se paramètre comme une TTable (DatabaseName et SessionName) et la requête SQL doit être affectée à la propriété SQL.

Pour une requête de type sélection, on pourra utiliser la méthode Open, alors que pour une requête de modification de la base de données on utilisera la méthode ExecSQL. Enfin, il est possible d'utiliser la méthode Close pour désactiver le composant TQuery.

2 - Quelques éléments prérequis aux études de cas

Nous en venons au principal but de ce document : fournir un exemple de configuration pour pouvoir se connecter à une base de données ACCESS. Cette étude de cas présente, pour chaque type de pilotes, une démarche pour établir la connexion à la base de données (étant entendu que la démarche devra être adaptée selon les exigences de votre application, pour cela quelques pistes en complément).

2-1 - Les différents types de pilotes et Access

En parcourant l'administrateur BDE, vous constaterez qu'il y a 2 familles de drivers utilisables : les drivers natifs, et les drivers ODBC. Pour le cas particulier d'Access, il faut savoir qu'à partir d'Access2000 il n'est plus possible d'utiliser les drivers natifs. Néanmoins, leur utilisation peut très bien se faire pour des fichiers au format Access95 ou Access97.

Dans la suite, un cas d'étude sera présenté pour chaque type de pilote.

2-2 - Prérequis

J'ai pour cela créé une base de données sous Access que j'ai appelée maBdd.mdb.

Elle contient 2 tables : Etudiant et Option.

Créons également un nouveau projet par : >Fichier>Nouveau>Application

Déposons ensuite les composants suivants sur la fiche :

- TSession

- TDatabase

- TTable

3 - Etude de cas en ODBC

Faisons avant tout un petit tour dans le module d'administration (accessible à partir du Panneau de Configuration par exemple) du BDE pour y définir un alias pour l'accès à notre base de données.

3-1 - Quelques mots sur le DSN

Un DSN (Data Source Name) est un alias d'une source de donnée qu'on veut rendre accessible par ODBC.

Il existe 3 types de DSN : les DSN utilisateur (uniquement disponibles pour le profil utilisateur qui les crée), les DSN système (disponibles pour tout utilisateur de la machine ainsi que les services), et les DSN fichier (entre les 2 précédents, l'alias est stocké dans un fichier et l'utilisation du DSN est donc limitée aux utilisateurs pouvant accéder à ce fichier).

3-2 - Création d'un DSN

>Objet>Administrateur ODBC>Sources de données utilisateur

Cliquez sur "Ajouter" et sélectionnez "Driver do Microsoft Access (*.mdb)", puis vous obtiendrez l'écran suivant :

Ici il suffit de donner un nom à votre DSN et de sélectionner la base de données cible.

Vous obtiendrez ainsi le résultat suivant (un alias a été automatiquement créé à partir de votre DSN) :

Un double-clic sur MonAlias devrait vous permettre de tester la connexion à votre base de données. La réussite de cette connexion est un gage de sécurité pour la réussite de la connexion à travers votre programme.

Avec ces quelques informations vous serez capables, lors du déploiement de votre application, de déployer également le BDE et notamment votre alias DSN. Il ne reste donc qu'à sélectionner l'emplacement de la base de données au niveau du poste client. Encore mieux, dans une logique d'entreprise, si la base de données est accessible via le réseau, il n'y aura rien à modifier et l'application sera directement exploitable.

3-3 - Paramétrage des composants

En conservant les noms par défaut, nous allons définir les propriétés classiques pour configurer les composants.

Pour Session1, dans l'inspecteur d'objet, saisissez "MaSession" pour la propriété Name.De même, sélectionnez "MaSession" pour la propriété SessionName de Database1.

Double-cliquez ensuite sur le composant Database1, vous obtenez une fenêtre de configuration que vous pourrez renseigner comme suit :

Nous allons maintenant pouvoir tester si tout a bien été paramétré jusqu'ici : faites passer la propriété Connected de Database1 à true et constatez que tout se passe bien (i.e. pas de message d'erreur).

Nous allons maintenant relier Table1 à Session1 et Database1 par les propriétés SessionName ("MaSession") et DatabaseName ("MaBdd"), puis sélectionner la table Etudiant dans la propriété TableName (si les tables ne sont pas proposées, cela signifie que la connexion n'est pas valide).

La configuration est maintenant terminée, vous devriez avoir obtenu la vue suivante :

4 - Etude de cas en natif

La configuration est assez rapide en natif, mais elle est particulièrement instable d'un environnement à l'autre... Néanmoins, le recours à un driver natif peut s'avérer utile du point de vue des performances lorsqu'on doit gérer une base de données de taille importante.

4-1 - Edition du pilote natif

Selon la version d'Access relative à votre fichier, il faudra choisir l'une ou l'autre des dll proposées :

Pour Access95 : DLL32 = IDDAO32.DLL
Pour Access97 : DLL32 = IDDA3532.DLL

4-2 - Paramétrage des composants

Nous allons ici utiliser une configuration possible du composant Database1 basée sur les propriétés DriverName et Params.

En conservant les noms par défaut, nous allons définir les propriétés classiques pour configurer les composants.

Pour Session1, dans l'inspecteur d'objet, saisissez "MaSession" pour la propriété Name.

De même, sélectionnez "MaSession" pour la propriété SessionName de Database1.

Double-cliquez ensuite sur le composant Database1, vous obtenez une fenêtre de configuration que vous pourrez renseigner comme suit (paramètre DATABASE NAME à adapter évidemment) :

Pour faire le lien avec l'autre possibilité de configuration de votre composant Database, les informations saisies dans Paramètres de connexion sont les informations qui apparaissent lorsque vous vous servez d'un alias créé dans le BDE. Ainsi, pour le cas des drivers ODBC, on retrouve par exemple le champ ODBC DSN qu'on peut voir dans un alias ODBC.

Nous allons maintenant pouvoir tester si tout a bien été paramétré jusqu'ici : faites passer la propriété Connected de Database1 à true et constatez que tout se passe bien (i.e. pas de message d'erreur).

Nous allons maintenant relier Table1 à Session1 et Database1 par les propriétés SessionName ("MaSession") et DatabaseName ("MaBdd"), puis sélectionner la table Etudiant dans la propriété TableName (si les tables ne sont pas proposées, la connexion n'est pas valide).

La configuration est maintenant terminée, vous devriez avoir obtenu la vue suivante :

5 - Exemples d'utilisation de composants du BDE

Pour illustrer la présentation que nous avons faite des composants de la palette BDE, nous allons interagir avec notre base de données en prenant 2 exemples.

5-1 - Affichage du contenu d'une table

5-1-1 - Les composants à ajouter

Nous allons rajouter en plus des composants déjà utilisés dans la configuration de l'accès à la base de données, un bouton Button1 ayant pour libellé "Afficher" et un mémo "Memo1".

Vous devriez avoir quelque chose qui ressemble à ce qui suit :

5-1-2 - Affichage du contenu de la table ETUDIANT

Nous allons commencer par ajouter une méthode afficher comme suit :

Dans Unit1.cpp

void __fastcall TForm1::afficher()
{
AnsiString nom = "";
AnsiString prenom = "";
Memo1->Clear();

// ouverture connexion, bdd et table
Session1->Open();
Database1->Open();
Table1->Open();

// on se positionne au début
Table1->First();

// on parcourt la table
while(!Table1->Eof)
{
// on récupère les champs nom et prénom
nom = Table1->FieldByName("nom")->AsString;
prenom = Table1->FieldByName("prenom")->AsString;

// on ajoute une ligne à notre mémo
Memo1->Lines->Add(nom+" "+prenom);

// on passe à la ligne suivante
Table1->Next();
}

// on ferme connexion, bdd et table
Table1->Close();
Database1->Close();
Session1->Close();
}

Il suffit maintenant de relier cette méthode à l'événement OnClick de notre bouton en créant l'événement par défaut à partir de l'explorateur de classe et en rajoutant le code suivant.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
afficher();
}

Il ne reste plus qu'à exécuter pour avoir le résultat suivant :

5-2 - Exécution d'une requête

5-2-1 - Les composants à ajouter

Pour pouvoir exécuter une requête, nous allons déposer un TQuery (appelons le "MaRequete") sur la fiche, et renseigner les propriétés SessionName et DatabaseName.

Nous conservons "Memo1" et rajoutons également un bouton Button2 ayant pour libellé "AfficherReq".

Vous devriez avoir quelque chose qui ressemble à ce qui suit :

5-2-2 - La requête à exécuter

Nous allons réaliser une jointure entre les tables ETUDIANT et FILIERE pour pouvoir afficher les étudiants avec leur spécialité.

Il s'agit donc de récupérer les champs nom, prenom de la table ETUDIANT, et nom de la table FILIERE.
Pour cela, il suffit de définir le code SQL suivant dans la propriété SQL du composant Query1.

SELECT e.nom AS nom, e.prenom AS prenom, f.nom AS filiere FROM Etudiant e, Filiere f WHERE e.option=f.id

5-2-3 - Exécution de la requête et affichage

Nous allons commencer par ajouter une méthode afficherReq comme suit :

Dans Unit1.cpp

void __fastcall TForm1::afficherReq()
{
AnsiString nom = "";
AnsiString prenom = "";
AnsiString filiere = "";
Memo1->Clear();

// ouverture connexion, bdd et requête
Session1->Open();
Database1->Open();
Query1->Open();

// on se positionne au début
Query1->First();

// on parcourt le résultat de la requête
while(!Query1->Eof)
{
// on récupère les champs nom et prénom
nom = Query1->FieldByName("nom")->AsString;
prenom = Query1->FieldByName("prenom")->AsString;
filiere = Query1->FieldByName("filiere")->AsString;

// on ajoute une ligne à notre mémo
Memo1->Lines->Add(nom+" "+prenom+" - "+filiere);

// on passe à la ligne suivante
Query1->Next();
}

// on ferme connexion, bdd et requête
Query1->Close();
Database1->Close();
Session1->Close();
}

Il suffit maintenant de relier cet méthode à l'événement OnClick de notre bouton en créant l'événement par défaut à partir de l'explorateur de classe et en rajoutant le code suivant.

void __fastcall TForm1::Button2Click(TObject *Sender)
{
afficherReq();
}

Il ne reste plus qu'à exécuter pour avoir le résultat suivant :

5-3 - Le fichier ACCESS utilisé

Le fichier utilisé est disponible ici. Néanmoins, il correspond à la version Access2000 et il vous faudra configurer votre connexion avec ODBC car les pilotes natifs ne sont pas supportés par le BDE.

Personne ne vous empêche de reproduire ce petit exemple avec un fichier de type Access95 ou Access97.