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.

Examen Environnement de Développement

Document source

Examen Environnement de Développement

Informatique de Gestion, Développement d'Applications · DOCX · 3 pages · 2016

Consulter le document original →

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 :

  1. 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 idEquipe1 et idEquipe2 dans la table Match sont des clés étrangères pointant vers la table Equipe est vital pour faire les jointures permettant de compter les scores.
  2. Choisir les bonnes classes ADO.NET : Utilisez ExecuteScalar lorsque la requête SQL renvoie une seule valeur (comme un COUNT(*), utile pour TotalButsMarques). Utilisez ExecuteReader lorsque vous devez parcourir un jeu d'enregistrements ligne par ligne.
  3. 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ètres OleDbParameter (avec ? comme espace réservé) pour éviter les erreurs de syntaxe (par exemple, les apostrophes dans les noms) et les failles de sécurité.
  4. Gérer les ressources et les erreurs : Encadrez vos blocs d'exécution par des blocs Try...Catch...Finally. Le bloc Finally est 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.
  5. Réutiliser le code : Si l'examen vous demande de créer des fonctions globales (comme EditerScore dans 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.

Partager

Commentaires

Aucun commentaire pour le moment. Posez la première question.

Les commentaires sont relus avant publication. Votre e-mail n'est jamais affiché.

← Toutes les révisions