Bonjour, bonsoir à tous.
Comme l'indique le titre, j'essaie d'établir une requête sql paramétrée multiple mais je rencontre quelques difficultés. Mon but principal est le suivant :
Récupérer les notes (d'un étudiant) et les dates (des devoirs) en fonction du semestre (1 ou 2) du nom d'utilisateur et de la matière le tout affiché sous la matière correspondante. (Et par la suite, avec des COUNT, calculer la moyenne élève + classe)
(Exemple : L'étudiant Paul se connecte à l'application. Il souhaite voir ses notes, il clique donc sur le bouton "Voir mes notes". Se présente alors ses 8 matières sous lesquelles sont affichées toutes ses notes. Sous la matière Programmation, Paul peut voir qu'il a eu deux notes, sous la matière Économie & Droit, il n'en a pas eu.)
Précision : J'ai crée deux UserControl. L'un possédant les 8 matières et le second qui sera dupliqué en fonction du nombre de notes et dans lequel sera stocké la date et la note du contrôle :
UserControl1 (ControlDetailsNotes) :
UserControl2 (ControlDetailsNotes2):
J'ai donc, pour plus de clarté, créer une bibliothèque de classe dans laquelle j'ai structuré mon code de cette manière :
- Dans un premier temps, je créer ma méthode publique statique GetNote();.
- Ensuite, je déclare dans une variable string mes requêtes, dans une seconde variable je déclare ma connexion, puis une troisième ma commande.
- J'initialise les deux variables (requête, connexion)
- J'ouvre ma connexion puis fais mes paramètres (en l’occurrence, mes paramètres sont les 8 matières, le semestre ainsi que le nom de l'élève).
- Je crée une variable de type int que j'initialise à 0 (permettra la création multiple d'un UserControl)
- Crée une variable reader assignée à un ExecuteReader();
- Et enfin, je fais une bouclepuis un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 while(reader.Read()) { ... }- Dans un second temps, je crée une seconde méthode nommée
Code : Sélectionner tout - Visualiser dans une fenêtre à part reader.NextResult();dans la quelle je mets le code de récupération des données (Dates + Notes) et de création de l'UserControl.
Code : Sélectionner tout - Visualiser dans une fenêtre à part ReaderRead();
Code :
Méthode principale : (J'ai raccourci le code à 2 matières pour l'explication)
Méthode ReaderRead :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 public static void GetNotes(Panel pn1, Panel pn2, string user) // Ces paramètres (pn1, pn2 correspondent au nombre de matières // UserControl2 (ControlDetailsNotes2) sera placé dans des panels sous toutes les matières { string commandText = @"SELECT Note, Date FROM Notes WHERE Semestre=@semestre AND Eleve=@eleve AND Matiere=@m1; SELECT Note, Date FROM Notes WHERE Semestre=@semestre AND Eleve=@eleve AND Matiere=@m2;"; using (MySqlConnection dbConnection = new MySqlConnection(@"server=mysql-****.always****.net;Port=3306; userid=****; password=****; database=**_bdd;")) using (MySqlCommand dbCommand = new MySqlCommand(commandText, dbConnection)) { dbCommand.CommandType = CommandType.Text; dbConnection.Open(); // Les paramètres : Le but est de récupérer les Dates des devoirs et Notes des devoirs pour toutes les matières et pour l'user connecté dbCommand.Parameters.Add(new MySqlParameter("@m1", MySqlDbType.VarChar)); dbCommand.Parameters["@m1"].Value = "Programmation"; dbCommand.Parameters.Add(new MySqlParameter("@m2", MySqlDbType.VarChar)); dbCommand.Parameters["@m2"].Value = "Économie et Droit"; dbCommand.Parameters.Add(new MySqlParameter("@semestre", MySqlDbType.VarChar)); dbCommand.Parameters["@semestre"].Value = "1"; dbCommand.Parameters.Add(new MySqlParameter("@eleve", MySqlDbType.VarChar)); dbCommand.Parameters["@eleve"].Value = user; //Je récupère le nom d'utilisateur //Cette variable sert à dupliquer UserControl2 (notes + dates) tant qu'il y a des notes int cptr = 0; var reader = dbCommand.ExecuteReader(); // Logiquement : Tant que le programme lira des données, il créera ControlDetailsNotes2 (UserControl2) tant qu'il y aura des données while (reader.Read()) { ReaderRead(reader, -1, 3, cptr, 52, pn1); // -1,3 : Position du Contrôle Utilisateur | (cptr++ * 52) : Espaces entre les contrôles utilisateurs } reader.NextResult(); while (reader.Read()) { ReaderRead(reader, -1, 3, cptr, 52, pn1); } } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 private static void ReaderRead(MySqlDataReader reader, int x, int y, int cptr, int multp, Panel tm) { DateTime dt; ControlDetailsNotes2 ccc = new ControlDetailsNotes2(); dt = reader.GetDateTime("Date"); Math.Round(Convert.ToDecimal(ccc.LblNoteControleM.Text = reader.GetDouble("Note").ToString()), 2); ccc.Location = new Point(x, y + (cptr++ * multp)); ccc.LblDateM.Text = "le " + dt.ToString("dd/MM"); if (Convert.ToDecimal(ccc.LblNoteControleM.Text) < 10) { ccc.LblNoteControleM.ForeColor = Color.DarkRed; } else if (Convert.ToDecimal(ccc.LblNoteControleM.Text) > 11) { ccc.LblNoteControleM.ForeColor = Color.Green; } //pn correspond à la matière (Ex : pn1 : Programmation) - (pn2 : Économie & Droit) pn.Controls.Add(ccc); }
Et enfin, le code pour accéder à la bibliothèque :
Hélas, le résultat n'est pas concluant. En effet, quand je test, au lieu d'avoir deux notes dans la matière "Programmation", j'obtiens seulement une note avec la date. Cette note correspond à la première matière de la requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part [...].Notes.GetNotes(panelControlDN1, panelControlDN2, panelControlDN3, panelControlDN4, panelControlDN5, panelControlDN6,panelControlDN7,panelControlDN8, lblInfosUser.Text);
Désolé d'avance pour la longueur du post et le code qui peut sembler brouillon.
Merci,
Cordialement.
Partager