• Aucun résultat trouvé

TP4A - Bases de données

N/A
N/A
Protected

Academic year: 2022

Partager "TP4A - Bases de données"

Copied!
6
0
0

Texte intégral

(1)

TP4A - Bases de données

Description

La première partie du TP4 vise à vous familiariser avec l'utilisation des classes d'objets dédiés au traitement des données au moyen du contrôle extérieur des Gestionnaires de bases de données. Ici, l'utilisation d'une base Access est circonstanciel au fait que l'accès en est plus simple que pour les autres types de gestionnaires (Oracle, SQLServer, etc.). Mais les principes développés s'y appliquent tout autant.

Vous trouverez, en plus de ce document-ci le fichier «TP4A_Texte.txt» qui contient la plupart des énoncés nécessaires à la mise au point de l'application, ainsi que le dossier «Source_TP4A» contenant un embryon de celle-ci.

Dans le dossier «Bin» de l'application se trouve une base de données Access «Employes.mdb» utilisée par celle-ci. Si vous ouvrez la base, vous y verrez deux tables, l'une contenant la liste des employés et l'autre, la liste des départements de l'entreprise. Ce n'est que cette dernière qui sera utilisée pour notre application-exemple.

La table contient 4 champs : «NumDépt» de type numérique, «NomDépt»,

«Ville» et «Téléphone» de type String. On peut facilement deviner le contenu de ces 4 champs. La clé primaire étant le numéro de département, la liste se présente donc dans cet ordre.

Pas à pas

Étape 0 : Fonctionnement de l'application

Avant de passer à la mise au point de l'application, voyons le fonction- nement du modèle qui se trouve dans le dossier «TP4\TP4A». Lors du lancement du programme, plusieurs messages s'afficheront dont nous verrons la signification plus loin. Puis apparaît la feuille principale comportant 4 zones de texte identifiées selon les 4 champs de la base de données. Pour l'instant, les données affichées sont celles du premier enregistrement de la table des départements.

Si vous cliquez sur les 4 boutons de déplacement, vous pourrez parcourir les différents enregistrements de la table. Si vous modifiez par exemple le numéro de téléphone du département des finances, le changement sera conservé. Si vous supprimez un enregistrement (ou deux) ils disparaîtront de la liste. Enfin, si vous ajoutez un enregistrement, vous verrez qu'il faudra placer un entier multiple de 10 comme numéro de département.

Enfin, au moment de quitter, lun message vous indiquera le nombre d'enregistrements «touchés» par votre mise à jour.

(2)

Étape 1 : Projet «TP4A»

Ouvrez l'application «TP4A.sln» (dossier «Source_TP4A») et observez la feuille principale. Les contrôles sont définis, ainsi que les procédures événemen- tielles, du moins les en-têtes. Il n'y a plus qu'à «remplir les trous».

1 - D'abord, comme vous aurez besoin de classes d'objets définies dans un espace de nom spécifique, placez au tout début du code l'énoncé

Imports System.Data.OleDB

qui vous donnera accès à «vos» objets

2 - Dans la zone générale de la page de code, placez la déclaration des 7 variables suivantes qui établiront le lien entre les valeurs de la base et les contrôles de votre feuille. Nous les analyserons à mesure de leur instanciation.

Dim MaConn As OleDbConnection Dim MaCommande As OleDbCommand Dim MonAdapt As OleDbDataAdapter Dim MonDataSet As DataSet

Dim MaDataTable As DataTable Dim MaDataVue As DataView

Dim MonBind As BindingManagerBase

Étape 2 : Connexion à la base (Form_Load)

La procédure «Form_Load» établit la relation avec la base de données, étape par étape. On y trouve un «Try ... Catch ... End Try» pour prévenir le cas où la base est inaccessible.

3 - Au début de la procédure, déclarez et définissez les variables suivantes :

Dim ConnString, Conn1, Conn2, Conn3 As String

Conn1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="

Conn2 = "Employes.mdb"

Conn3 = ";Persist Security Info=False"

ConnString = Conn1 & Conn2 & Conn3

dont le but est de définir la chaîne de connexion de type «Access»

composée de trois parties dont la deuxième est simplement le nom de la base de données, soit «Employes.mdb».

4 - La chaîne de connexion permet de créer un objet «Connection» dont la propriété (la chaîne) indique le type de fichier et le type de connexion à utiliser. La méthode «Open()» établit le lien ... si possible. D'où l'utilité de la structure «Try» qui envoie un message explicatif et ferme la feuille. On verra plus loin le but des deux énoncés «superflus» qui suivent.

Try

MaConn = New OleDbConnection(ConnString) MaConn.Open()

Catch

MsgBox("FIN : Connexion impossible") Me.Close()

MsgBox("FIN2") 'Exit Sub End Try

(3)

5 - On doit maintenant indiquer, parmi les tables de la base (qui peuvent être nombreuses) laquelle on désire traiter. La chaîne «SQL» fait partie d'un

«langage universel» des bases de données mis au point pour allez faire une telle requête.

Dim ComSQL As String = "Select * from [Départements];"

Elle signifie : je veux tous les champs de la table «Départements»

6 - Une fois que l'on a défini la connexion ET la requête de sélection, on peut alors créer une «commande» qui permettra d'obtenir ce que l'on recherche.

Encore ici, on place le code dans une structure de détection d'erreurs (exceptions)

Try

MaCommande = New OleDbCommand(ComSQL, MaConn)

Cette commande permettra à un objet «analyseur», semblable au

«DataReader» des fichiers séquentiels) d'obtenir les informations qui proviennent de la table et éventuellement de les traiter.

7 - Un DataAdapter peut justement utiliser les commandes SQL pour aller chercher et traiter des information de la table au moyen d'un objet

«Command». En lui fournissant l'objet «Command» lors de sa création, on lui indique quelle fichier (Connexion) et quelle requête il doit utiliser.

MonAdapt = New OleDbDataAdapter(MaCommande) ' MonAdapt.SelectCommand = MaCommande ' MonAdapt.DeleteCommand = ???

' MonAdapt.UpdateCommand = ???

' MonAdapt.InsertCommand = ???

La commande soumise devient donc la propriété «SelectCommand» de l'objet qui pourra l'utiliser pour «LIRE» les données. Mais si on désire faire la mise à jour, on doit indiquer AUSSI quelles sont les commandes nécessaires pour supprimer, modifier et ajouter un enregistrement, Faute de quoi, on ne pourra que consulter les données de la table.

8 - Comme ces commandes sont assez complexes (bien que les «experts»

peuvent les écrire les yeux fermés), VB offre un objet (CommandBuilder) qui, par la simple analyse de la commande de sélection, peut produire les trois autres commandes. Il suffit de lui donner en pâture la première commande et il construit illico les 3 autres.

Dim MonBuild As New OleDbCommandBuilder(MonAdapt) MonBuild.QuotePrefix = "["

MonBuild.QuoteSuffix = "]"

' MonBuild.DataAdapter = MonAdapt

MsgBox("3 : " & MonAdapt.SelectCommand.CommandText)

Lors de la création de l'objet, le paramètre du constructeur indique quel DataAdapter doit être ainsi «dépanné». Notez que la quatrième ligne ci-haut est équivalente à la première, les deux ayant le même effet. Les propriétés

«Prefix» et «Suffix» indique au «Builder» que les noms des champs en Access doivent au besoin être entourés des [parenthèses carrées]. Le message illustre que la propriété «Chaîne SQL» de la commande de sélection (lecture) est bien celle que l'on a défini plus tôt.

(4)

9 - En théorie, et selon les textes d'aide de Microsoft, le seul fait de lier le Builder avec son DataAdapter devrait suffire pour que le premier analyse la commande de sélection et produise les trois autres commandes. Cependant il n'en va pas toujours ainsi et les énoncés suivants servent à «extraire manu militari» les commandes désirées.

MonAdapt.DeleteCommand = MonBuild.GetDeleteCommand() MsgBox(MonAdapt.DeleteCommand.CommandText)

MonAdapt.UpdateCommand = MonBuild.GetUpdateCommand() MsgBox(MonAdapt.UpdateCommand.CommandText)

MonAdapt.InsertCommand = MonBuild.GetInsertCommand() MsgBox(MonAdapt.InsertCommand.CommandText)

MonAdapt possède maintenant tous les outils pour communiquer dans les deux sens avec la base.

10 - Une des tâches potentielle du DataAdapter est de créer en mémoire une copie des informations contenues dans la base et permettre ainsi de modifier localement les informations aant de faire la mise à jour définitive.

Un DataSet est un objet dont la structure est semblable à une base de données et qui par conséquence peut contenir l'équivalent d'une ou de plusieurs tables. Ici, nous n'enverrons qu'un seul «jeu d'enregistrement»

dans le DataSet qui ne contiendra par conséquent qu'une seule table.

MonDataSet = New DataSet

MonAdapt.Fill(MonDataSet, "UnNom")

MaDataTable = MonDataSet.Tables("UnNom") MaConn.Close()

MsgBox("Connexion fermée")

La méthode «Fill» du DataAdapter place le jeu d'enregistrements obtenus par la commande de sélection dans une table du DataSet et lui donne un nom arbitraire, ici «UnNom». En général, on cherchera à donner un nom significatif aux tables, surtout s'il y en a plus d'une ... La variable

«MaDataTable» (de type «DataTable») désignera donc le jeu d'enregis- trements obtenus. Une fois les informations reçues, on peut fermer la connexion pour éviter de surcharger les ressources du réseau.

11 - À cette étape-ci, on pourrait directement «jouer» dans la table et ajouter, modifier, supprimer les enregistrements. L'objet suivant, le «DataViw»

permet d'obtenir une «vue» spéciale de la table, par exemple d'en filtrer des enregistrements, de les trier selon un champ ou l'autre. Et en plus il permettra ensuite de relier les informations aux contrôles d'affichage de la feuille.

MaDataVue = New DataView(MaDataTable) ' MaDataVue.Sort = "NomDépt"

Ici, la variable «DataVue» présente les mêmes enregistrements que la table mais si on enlève la marque de commentaire (apostrophe), elle les présentera dans l'ordre croissant des noms des départements.

(5)

12 - Le dernier objet qui nous sera utile est de classe «BindingManagerBase», c'est-à-dire un éditeur de liens qui verra à associer le contenu des contrôles avec le contenu de la DataView. Les liens sont établis en deux étapes : d'abord on indique les relations qui doivent exister entre chacun des champs et une des propriétés d'un contrôle sur la feuille. Pour ce faire on utilise une propriété «DataBindings» déjà définie pour la plupart des contrôles.

txtCodeD.DataBindings.Add(New Binding("Text", MaDataVue, "NoDépt")) txtNomDept.DataBindings.Add(New Binding("Text", MaDataVue, "NomDépt")) txtVille.DataBindings.Add(New Binding("Text", MaDataVue, "Ville")) txtTel.DataBindings.Add(New Binding("Text", MaDataVue, "Téléphone"))

La propriété «DataBindings» est une collection qui définit les liaisons devant être gérés par l'objet «Gestionnaire de Liaisons», «MonBind» défini ci-haut.

On voit dans le premier énoncé que contrôle «txtCode» se voit attribuer une liaison entre sa propriété «Text» et la valeur du champ «NoDept» de la DataVue et que par conséquent, les deux valeurs doivent être synchronisées : un changement de l'un doit se refléter dans l'autre. Un même contrôle pourrait avoir plus d'une liaison, comme par exemple sa propriété «Texte» viendrait d'un champ et sa couleur de fond viendrait d'un autre champ.

13 - Il n'y a plus (enfin) qu'à charger le «BindingManager» de gérer les liens de tous les contrôles de la feuille qui ont des liaisons avec le DataView.

MonBind = Me.BindingContext(MaDataVue, "") MsgBox("La table est mise")

MonBind possède une propriété Position indiquant un numéro d'enregis- trement de la source d'information (MaDataVue». De sorte que la valeur des contrôle changera automatiquement lors du «déplacement» de la

«Position» parmi les enregistrements, soit entre 0 (le premier) et «.Count-1»

(le dernier). Au début, Position vaut «0» mais on peut naviguer dans la table en modifiant sa valeur.

14 - Il n'y a plus qu'à compléter la structure du «Try» pour terminer la procédure

«Form_Load».

Catch ex As Exception MsgBox(ex.Message) Me.Close()

End Try

Ici, on affiche le message d'erreur de l'exception.

15 - Curiosité. Si vous lancez l'exécution à cette étape-ci, vous verrez apparaître le premier enregistrement de la table, et c'est tout. Mais si vous modifiez temporairement le nom du fichier «Access» pour qu'il ne soit pas reconnu, vous verrez que dans la zone «Catch» du premier «Try», l'énoncé

«Me.Close» ne terminera pas le programme et celui-ci se continuera jusqu'à la fin de la procédure. Pour empêcher ce débordement, réactivez l'énoncé

«Exit Sub» pour «sauter» le reste des instructions.

(6)

Étape 3 : Déplacement dans la table et modifications

Il reste à gérer le déplacement dans la table, semblable à celui effectué lors du TP1 au moyen des boutons «Premier», «Dernier», Précédent» et

«Suivant»

16 - Utilisez adéquatement la propriété Position de «MonBind» pour «viser le premier enregistrement (no 0), le dernier (.Count - 1) et les autres (+ ou - 1) 17 - La suppression se fait au moyen de la méthode «RemoveAt()». Donc pour

supprimer l'enregistrement courant :

MonBind.RemoveAt(MonBind.Position)

18 - On ajoute un enregistrement vide simplement en invoquant la méthode

«AddNew» et il suffit de le pointer (Position) pour pouvoir l'éditer.

Dim K As Integer K = MonBind.Count MaDataVue.AddNew() MonBind.Position = K

19 - La validation empêche : un numéro «vide», une valeur non numérique et une valeur qui n'est pas un multiple de 10.

Dim K As Integer

If txtCodeD.Text = "" Then e.Cancel = True Try

K = CType(txtCodeD.Text, Integer) Catch ex As Exception

e.Cancel = True Exit Sub

End Try

If K Mod 10 > 0 Then e.Cancel = True

20 - La procédure de fermeture doit cependant activer la mise à jour : tous les changements à la table ont été faits DANS LA MÉMOIRE seulement. Il importe donc de recopier ces informations dans la base de données. Le DataAdapter qui au début avait «rempli» (méthode «Fill») le DataSet pourra maintenant faire l'inverse au moyen de la méthode «Update» ayant les mêmes paramètres : le nom du DataSet et la DataTable visée.

Dim R As Integer

If Not MaConn.State = ConnectionState.Open Then MaConn.Open() ' Au cas où le dernier n'a pas bougé

MonBind.Position = 1 MonBind.Position = 2

R = MonAdapt.Update(MonDataSet, "UnNom") MsgBox(R & " enregistrements modifiés") MaConn.Close()

Me.Close()

On vérifie si la connexion est fermée avant de l'ouvrir et comme la méthode

«Update» renvoie le nombre d'enregistrements modifiés, on peut afficher ce résultat. Pourquoi le «repositionnement» ? À voir au cours...(ou à deviner)

21 - Avant de terminer, si vous activez l'énoncé «MaDataVue.Sort =

"NomDépt"». l'affichage se fera dans l'ordre des noms de départements.

Références

Documents relatifs

L’ordre UPDATE permet la mise à jour de valeurs de colonnes dans une table 1 selon la valeur d’une condition exprimée dans la clause WHERE... DELETE FROM :

Afficher le Prénom et Nom de tous les employés ayant une permanence selon l’ordre alphabétique des noms puis

Selon les statistiques des annees precedentes, les resultats nanciers de la construction d'une maison individuelle sont les suivants: prot positif dans 70% des cas, prot nul dans 20%

2) Le temps pendant lequel une montre fonctionne sans avoir besoin d'^etre remise a l'heure suit une loi exponentielle avec une moyenne de 120 jours. Quelle est la probabilite pour

Si vous avez déclaré des regroupements, vous devez, au niveau du code organisme, choisir dans la liste déroulante l’organisme opérationnel auquel le dépôt est rattaché. Cliquez

Il convient de souligner qu f on ne peut vérifier la qualité d'un produit une fois qu'il est achevé, mais qu'il faut s'en préoccuper tout au long et dès le début du processus

tification pour vérifier le gain de compétence pro- fessionnelle des étudiants, entre leur entrée à l’uni- versité et la fin de leur cursus, leur donnant le droit de se présenter

Gallimard