Examen Environnement de Développement
Problème : Gestion des résultats de l'EURO 2016 Remarque préliminaire : Le schéma relationnel (Figure 1) ainsi que l'interface graphique du prototype n'ont pas été correctement extraits du document source (images inaccessibles).
D'après le document Examen Environnement de Développement
Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.

Document source
Informatique de Gestion, Développement d'Applications · DOCX · 3 pages · 2016
Problème : Gestion des résultats de l'EURO 2016
Remarque préliminaire : Le schéma relationnel (Figure 1) ainsi que l'interface graphique du prototype n'ont pas été correctement extraits du document source (images inaccessibles). Pour assurer l'exactitude du code, nous posons les hypothèses suivantes basées sur la description textuelle pour les noms des tables et des colonnes :
- Table Equipe (idEquipe, nomEquipe)
- Table Joueur (idJoueur, nom, prenom, idEquipe)
- Table Match (idMatch, dateMatch, heureMatch, MatchString, idEquipe1, idEquipe2, stade)
- Table Buteur (idButeur, idJoueur, idMatch, minuteBut)
- Les noms des contrôles de l'interface sont supposés classiques (ComboBox1, Label1, ListBox1).
Question 1 - Implémentation du module ResultatsMatch
Cette première partie nécessite de configurer la connexion à la base de données Access 2007 et d'écrire trois fonctions d'interrogation. Pour Access 2007 (fichiers .accdb), le fournisseur OLEDB requis est Microsoft.ACE.OLEDB.12.0.
Voici le squelette du module complété avec des requêtes SQL paramétrées (utilisant le symbole ? propre à OLEDB) afin de garantir la sécurité contre les injections SQL.
Imports System.Data.OleDb
Public Module ResultatsMatch
' Déclaration de la connexion avec le bon fournisseur pour Access 2007
Public conx As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Euro2016.accdb")
Dim ds As New DataSet
Public Function ListerJoueursEquipe(idEq As Integer) As List(Of String)
Dim listeJoueurs As New List(Of String)()
Dim requete As String = "SELECT nom, prenom FROM Joueur WHERE idEquipe = ?"
Dim cmd As New OleDbCommand(requete, conx)
cmd.Parameters.AddWithValue("?", idEq)
Try
conx.Open()
Dim reader As OleDbDataReader = cmd.ExecuteReader()
While reader.Read()
listeJoueurs.Add(reader("nom").ToString() & " " & reader("prenom").ToString())
End While
reader.Close()
Catch ex As Exception
MsgBox("Erreur : " & ex.Message)
Finally
If conx.State = ConnectionState.Open Then conx.Close()
End Try
Return listeJoueurs
End Function
Public Function TotalButsMarques(idMat As Integer) As Integer
Dim total As Integer = 0
Dim requete As String = "SELECT COUNT(*) FROM Buteur WHERE idMatch = ?"
Dim cmd As New OleDbCommand(requete, conx)
cmd.Parameters.AddWithValue("?", idMat)
Try
conx.Open()
' ExecuteScalar est idéal pour retourner une valeur unique comme un COUNT
total = Convert.ToInt32(cmd.ExecuteScalar())
Catch ex As Exception
MsgBox("Erreur : " & ex.Message)
Finally
If conx.State = ConnectionState.Open Then conx.Close()
End Try
Return total
End Function
Public Function EditerScore(idMat As Integer, idEq1 As Integer, idEq2 As Integer) As String
Dim scoreEq1 As Integer = 0
Dim scoreEq2 As Integer = 0
' Requête pour compter les buts d'une équipe spécifique lors d'un match précis
Dim requete As String = "SELECT COUNT(*) FROM Buteur B INNER JOIN Joueur J ON B.idJoueur = J.idJoueur WHERE B.idMatch = ? AND J.idEquipe = ?"
Dim cmd As New OleDbCommand(requete, conx)
' OLEDB utilise des paramètres positionnels
cmd.Parameters.Add("idMat", OleDbType.Integer)
cmd.Parameters.Add("idEq", OleDbType.Integer)
Try
conx.Open()
' Calcul pour l'équipe 1
cmd.Parameters(0).Value = idMat
cmd.Parameters(1).Value = idEq1
scoreEq1 = Convert.ToInt32(cmd.ExecuteScalar())
' Calcul pour l'équipe 2
cmd.Parameters(0).Value = idMat
cmd.Parameters(1).Value = idEq2
scoreEq2 = Convert.ToInt32(cmd.ExecuteScalar())
Catch ex As Exception
MsgBox("Erreur : " & ex.Message)
Finally
If conx.State = ConnectionState.Open Then conx.Close()
End Try
' Retourner la chaîne formatée "Nombre1-Nombre2"
Return scoreEq1.ToString() & "-" & scoreEq2.ToString()
End Function
End Module
Question 2 - Interface et événements
L'image de l'interface graphique étant manquante, nous supposerons que l'interface contient une ComboBox1 (listant les matchs, avec ValueMember réglé sur idMatch), une ListBox1 pour afficher les détails du match (date, score, buteurs), et que les noms des boutons correspondent à leurs fonctions.
Événement du bouton : Afficher Résultats Match
Nous devons extraire les informations générales du match (date, équipes), calculer le score via la fonction EditerScore, puis lister les buteurs.
Private Sub btnAfficherResultats_Click(sender As Object, e As EventArgs) Handles btnAfficherResultats.Click
If ComboBox1.SelectedIndex = -1 Then
MsgBox("Veuillez sélectionner un match.")
Exit Sub
End If
Dim idMatch As Integer = Convert.ToInt32(ComboBox1.SelectedValue)
ListBox1.Items.Clear()
' 1. Récupération des détails du match
Dim dateMatch As String = ""
Dim idEq1 As Integer = 0
Dim idEq2 As Integer = 0
Dim reqMatch As String = "SELECT dateMatch, idEquipe1, idEquipe2 FROM Match WHERE idMatch = ?"
Dim cmdMatch As New OleDbCommand(reqMatch, conx)
cmdMatch.Parameters.AddWithValue("?", idMatch)
Try
conx.Open()
Dim readerMatch As OleDbDataReader = cmdMatch.ExecuteReader()
If readerMatch.Read() Then
dateMatch = Convert.ToDateTime(readerMatch("dateMatch")).ToString("dd/MM/yyyy")
idEq1 = Convert.ToInt32(readerMatch("idEquipe1"))
idEq2 = Convert.ToInt32(readerMatch("idEquipe2"))
End If
readerMatch.Close()
' 2. Édition du score
Dim scoreFinal As String = EditerScore(idMatch, idEq1, idEq2)
ListBox1.Items.Add("Date du match : " & dateMatch)
ListBox1.Items.Add("Score final : " & scoreFinal)
ListBox1.Items.Add("--- Buteurs ---")
' 3. Récupération des buteurs
Dim reqButeurs As String = "SELECT J.nom, J.prenom, E.nomEquipe FROM (Buteur B INNER JOIN Joueur J ON B.idJoueur = J.idJoueur) INNER JOIN Equipe E ON J.idEquipe = E.idEquipe WHERE B.idMatch = ?"
Dim cmdButeurs As New OleDbCommand(reqButeurs, conx)
cmdButeurs.Parameters.AddWithValue("?", idMatch)
Dim readerButeurs As OleDbDataReader = cmdButeurs.ExecuteReader()
While readerButeurs.Read()
ListBox1.Items.Add(readerButeurs("nom").ToString() & " " & readerButeurs("prenom").ToString() & " (" & readerButeurs("nomEquipe").ToString() & ")")
End While
readerButeurs.Close()
Catch ex As Exception
MsgBox("Erreur : " & ex.Message)
Finally
If conx.State = ConnectionState.Open Then conx.Close()
End Try
End Sub
Événement du bouton : Meilleur Buteur Euro 2016
Pour trouver le joueur ayant marqué le maximum de buts, nous pouvons utiliser une requête SQL avec GROUP BY sur le joueur, ordonnée par le compte de buts en ordre décroissant, en ne conservant que le premier résultat (TOP 1 en syntaxe Access).
Private Sub btnMeilleurButeur_Click(sender As Object, e As EventArgs) Handles btnMeilleurButeur.Click
Dim requete As String = "SELECT TOP 1 J.nom, J.prenom, E.nomEquipe, COUNT(B.idButeur) AS TotalButs " &
"FROM (Buteur B INNER JOIN Joueur J ON B.idJoueur = J.idJoueur) " &
"INNER JOIN Equipe E ON J.idEquipe = E.idEquipe " &
"GROUP BY J.nom, J.prenom, E.nomEquipe " &
"ORDER BY COUNT(B.idButeur) DESC"
Dim cmd As New OleDbCommand(requete, conx)
Try
conx.Open()
Dim reader As OleDbDataReader = cmd.ExecuteReader()
If reader.Read() Then
Dim nomButeur As String = reader("nom").ToString() & " " & reader("prenom").ToString()
Dim equipe As String = reader("nomEquipe").ToString()
Dim buts As String = reader("TotalButs").ToString()
MsgBox("Le meilleur buteur est " & nomButeur & " (" & equipe & ") avec " & buts & " buts.")
Else
MsgBox("Aucun buteur trouvé.")
End If
reader.Close()
Catch ex As Exception
MsgBox("Erreur : " & ex.Message)
Finally
If conx.State = ConnectionState.Open Then conx.Close()
End Try
End Sub
Événement du bouton : Sauvegarder Tous les résultats
Le format attendu est "DateMatch MatchString Score1-Score2". Nous allons utiliser la classe System.IO.StreamWriter pour écrire dans le fichier texte spécifié.
Imports System.IO
Private Sub btnSauvegarder_Click(sender As Object, e As EventArgs) Handles btnSauvegarder.Click
Dim requete As String = "SELECT idMatch, dateMatch, MatchString, idEquipe1, idEquipe2 FROM Match"
Dim cmd As New OleDbCommand(requete, conx)
Dim cheminFichier As String = "Resultats.txt"
Try
conx.Open()
Dim reader As OleDbDataReader = cmd.ExecuteReader()
' Utilisation de StreamWriter pour créer ou écraser le fichier texte
Using writer As New StreamWriter(cheminFichier, False)
While reader.Read()
Dim idMatch As Integer = Convert.ToInt32(reader("idMatch"))
Dim dateMatch As DateTime = Convert.ToDateTime(reader("dateMatch"))
Dim matchString As String = reader("MatchString").ToString()
Dim idEq1 As Integer = Convert.ToInt32(reader("idEquipe1"))
Dim idEq2 As Integer = Convert.ToInt32(reader("idEquipe2"))
' Utilisation de la fonction développée dans la question 1
Dim score As String = EditerScore(idMatch, idEq1, idEq2)
' Écriture de la ligne formatée (ex: 10/06/2016 France-Roumanie 2-1)
Dim ligne As String = dateMatch.ToString("dd/MM/yyyy") & " " & matchString & " " & score
writer.WriteLine(ligne)
End While
End Using
reader.Close()
MsgBox("Les résultats ont été sauvegardés avec succès dans " & cheminFichier)
Catch ex As Exception
MsgBox("Erreur lors de la sauvegarde : " & ex.Message)
Finally
If conx.State = ConnectionState.Open Then conx.Close()
End Try
End Sub
Méthode
Lorsque vous abordez un examen de développement logiciel impliquant des bases de données sous .NET (ADO.NET), respectez toujours ces étapes fondamentales :
- Analyser le schéma de données : Identifiez immédiatement les clés primaires et les clés étrangères. Dans cet exercice, comprendre que
idEquipe1etidEquipe2dans la tableMatchsont des clés étrangères pointant vers la tableEquipeest vital pour faire les jointures permettant de compter les scores. - Choisir les bonnes classes ADO.NET : Utilisez
ExecuteScalarlorsque la requête SQL renvoie une seule valeur (comme unCOUNT(*), utile pourTotalButsMarques). UtilisezExecuteReaderlorsque vous devez parcourir un jeu d'enregistrements ligne par ligne. - Sécuriser les données avec les paramètres : Ne concaténez jamais directement des valeurs dans vos chaînes SQL (ex:
WHERE id = " & variable). Utilisez toujours les paramètresOleDbParameter(avec?comme espace réservé) pour éviter les erreurs de syntaxe (par exemple, les apostrophes dans les noms) et les failles de sécurité. - Gérer les ressources et les erreurs : Encadrez vos blocs d'exécution par des blocs
Try...Catch...Finally. Le blocFinallyest essentiel car il garantit que la connexion à la base de données (conx.Close()) sera libérée, même si une erreur SQL se produit durant l'exécution. - Réutiliser le code : Si l'examen vous demande de créer des fonctions globales (comme
EditerScoredans le Module), pensez à les appeler dans les événements de l'interface graphique (comme pour la sauvegarde du fichier texte) au lieu de réécrire la logique.
Commentaires
Aucun commentaire pour le moment. Posez la première question.