Gestion des relations ADO.NET en Visual C# avec SQL Server
Cet article explore la gestion des relations entre les tables d'une base de données SQL Server, ici nommée JDNotation, en utilisant les objets DataSet et DataRelation d'ADO.NET avec Visual C#. L'objectif est de réaliser un projet permettant d'exploiter et de visualiser ces relations pour manipuler efficacement les données liées dans une application Windows Forms.
Fonctionnalités de rafraîchissement et d'affichage
Pour maintenir une interface utilisateur claire et à jour, plusieurs méthodes sont utilisées pour gérer l'affichage des données.
Effacer les listes d'affichage
La méthode EffacerListes est conçue pour vider le contenu des contrôles de type ListBox (identifiés par des préfixes Lsb), qui affichent diverses informations. Cela inclut les codes de matière, les libellés, les coefficients, les numéros d'épreuve, les dates, les lieux, les numéros d'étudiant, les noms et prénoms, ainsi que les notes. Cette fonction est essentielle pour rafraîchir l'interface utilisateur avant d'afficher de nouvelles données.
Afficher les matières d'un module
La méthode MatieresDuModule prend en paramètre une ligne de données représentant un module (ModRow) et une relation de données (MyRel). Elle parcourt toutes les matières (lignes enfants) associées à ce module via la relation spécifiée. Pour chaque matière trouvée, elle ajoute son code, son libellé et son coefficient aux listes d'affichage correspondantes (LsbCodeMatière, LsbLibelléMatière, LsbCoefficient).
Afficher les épreuves d'une matière
Similaire à la méthode précédente, EpreuvesEnMatieres reçoit une ligne de données d'une matière (MatRow) et une relation. Avant d'afficher les nouvelles épreuves, elle vide les listes liées aux épreuves et aux notes. Ensuite, elle itère sur les épreuves (lignes enfants) associées à cette matière et ajoute le numéro de l'épreuve, sa date et son lieu aux listes correspondantes (LsbNumEpreuve, LsbDate, LsbLieu).
Afficher les notes d'une épreuve
La méthode NotesEnEpreuve affiche les notes obtenues pour une épreuve spécifique (EprRow). Elle utilise deux relations : MyRelEnf pour trouver les notes (enfants de l'épreuve) et MyRelPar pour récupérer les informations de l'étudiant (parent de la note). Après avoir vidé les listes, elle parcourt chaque note, ajoute le numéro de l'étudiant, concatène son nom et son prénom (obtenus via la relation parente MyRelPar vers la table Etudiants) et affiche la note dans LsbNumEtudiant, LsbNomPrenom et LsbNote.
Configuration de la connexion et des relations de données
La méthode BtnConnexion_Click est déclenchée lors de l'activation du bouton de connexion. Elle établit la connexion à la base de données SQL Server et charge les données dans un DataSet.
- Chaîne de connexion : Elle définit la chaîne de connexion (
MyStrConn) pour se connecter à une instance locale de SQL Server avec sécurité intégrée et la base de donnéesSQLJDNotation. - Commandes SQL : Des requêtes
SELECT * FROM [NomTable]sont créées pour chaque table (Modules,Matières,Epreuves,Notes,Etudiants). - Adaptateurs de données : Des objets
SqlDataAdaptersont initialisés pour chaque table, permettant de remplir leDataSetà partir des données de la base. - Remplissage du DataSet : Les adaptateurs remplissent le
MyDataSetavec les données de chaque table. - Définition des clés primaires : Les clés primaires sont définies pour chaque table du
DataSet, garantissant l'intégrité des données et permettant l'utilisation de la méthodeFindpour la recherche d'enregistrements.Modules:CodeModuleMatières:CodeMatièreEpreuves:NumEpreuveEtudiants:NumEtudiantNotes: Clé composite (NumEpreuve,NumEtudiant)
- Définition des relations : Des objets
DataRelationsont créés pour lier les tables entre elles, reflétant la structure relationnelle de la base de données :ModMat: LieModulesàMatièresparCodeModule.MatEpr: LieMatièresàEpreuvesparCodeMatière.EprNot: LieEpreuvesàNotesparNumEpreuve.FKEtuNot: LieEtudiantsàNotesparNumEtudiant.
- Affichage initial : Après la configuration, le premier module est affiché, et les matières associées sont chargées.
Gestion des interactions utilisateur
Les méthodes suivantes gèrent les événements de changement de sélection dans les ListBox et les clics sur les boutons de navigation.
Gestion de la sélection d'une matière
Lorsque la sélection change dans la liste des codes de matière (LsbCodeMatière), la méthode LsbCodeMatière_SelectedIndexChanged met à jour les sélections dans les listes associées (libellé, coefficient). Elle recherche ensuite la ligne de données complète de la matière sélectionnée dans le DataSet et appelle la méthode EpreuvesEnMatieres pour afficher les épreuves liées à cette matière.
Gestion de la sélection d'une épreuve
Cette méthode, LsbNumEpreuve_SelectedIndexChanged_1, réagit à un changement de sélection dans la liste des numéros d'épreuve. Elle synchronise les listes (date, lieu), trouve l'enregistrement de l'épreuve sélectionnée et utilise la méthode NotesEnEpreuve pour afficher toutes les notes associées à cette épreuve, en tenant compte des relations parent-enfant définies.
Navigation entre les modules
Les boutons de navigation permettent de parcourir les enregistrements des modules un par un ou de se positionner directement sur le premier ou le dernier.
BtnPremier_Click: Affiche le premier module.BtnPrecedent_Click: Affiche le module précédent, avec un message si l'utilisateur est déjà sur le premier enregistrement.BtnSuivant_Click: Affiche le module suivant, avec un message si l'utilisateur est déjà sur le dernier enregistrement.BtnDernier_Click: Affiche le dernier module.
Chacune de ces méthodes met à jour les champs de texte du module et rafraîchit les listes des matières associées en appelant EffacerListes et MatieresDuModule.
Foire aux questions (FAQ)
Qu'est-ce qu'un DataSet en ADO.NET et pourquoi est-il utilisé ici ?
Un DataSet est une représentation en mémoire des données d'une base de données. Il peut contenir plusieurs tables (DataTable), leurs relations (DataRelation) et leurs contraintes (Constraint). Il est utilisé ici pour stocker toutes les données des tables Modules, Matières, Epreuves, Notes et Etudiants localement, permettant une manipulation déconnectée de la base de données et une navigation aisée entre les enregistrements liés.
Comment les relations entre les tables sont-elles gérées dans le DataSet ?
Les relations sont gérées via l'objet DataRelation, qui lie deux DataTable dans le DataSet en utilisant des colonnes correspondantes. Par exemple, la relation ModMat lie la table Modules à la table Matières via la colonne CodeModule. Cela permet de naviguer facilement entre les données parentes et enfants, comme le montre l'utilisation de GetChildRows() et GetParentRow() dans les méthodes d'affichage.
Quel est l'intérêt de définir des clés primaires pour chaque DataTable dans le DataSet ?
Définir des clés primaires (PrimaryKey) pour chaque DataTable dans le DataSet est crucial pour l'intégrité des données en mémoire et pour des raisons de performance. Cela permet notamment d'utiliser la méthode DataTable.Rows.Find() pour rechercher rapidement un enregistrement spécifique par sa clé primaire, ce qui est mis en œuvre lors de la sélection d'une matière ou d'une épreuve dans l'interface utilisateur.