Meilleur auteur de réponses
Faire un graphique type Contrôle Chart, en lien avec Base De Données Mysql [C#]

Question
-
Bonjour tout le monde.
J'ai actuellement une application Windows Form dans laquelle je voudrai faire un graphique de type Contrôle Chart, en lien avec ma BDD MySql qui comporte environ 30 000 lignes.Je voudrai faire un graphique Histogramme par exemple, avec en abscisse la colonne Date de ma BDD, et en ordonnée ma colonne ResultatMesure.
J'ai trouvé deux lien pour faire un graphique en C# et le relier a une BDD:
http://plasserre.developpez.com/cours/chart/#LIII-C-4
http://msdn.microsoft.com/fr-fr/library/vstudio/dd489231%28v=vs.100%29.aspx
Mais je voudrai pouvoir choisir dans 2 textBox une date mini, et une date max, et mon graphique serait compris entre ces deux date précises. je ne veux pas mes 30 000 dates pour mon graphique...
Si quelqu'un a une idée ou une piste pour faire ceci je la veux bien !
Réponses
-
Bonjour
Vous devez ajouter deux paramètres de type date dans la procédures stockée (pas 9), DateStart et DateEnd.
Pur améliorer les performances, ajoutez un index sur la colonne date dans SQL Manager
CREATE INDEX index_name ON table_name (column_name).
Cordialement,
- Modifié Aurel Bera mardi 28 mai 2013 10:39
- Marqué comme réponse Aurel Bera vendredi 31 mai 2013 10:34
-
Le problème c’est que 10/01/2013 et 01/01/2014 comparées comme Texte ont un résultat diffèrent (erronée) que comparées comme Date.
Donc pour avoir le résultat correct on doit transformer la colonne dans des dates soit à l’exécution, avec une fonction de conversion, soit changer le type de la colonne dans la BD.
Je dirais que c’est mieux de les avoir dans la BD comme Date. Appliquer un filtre where sur une fonction (de conversion) pour un grand nombre des lignes dans la table n’est pas une bonne option de point de vue performances.
Le problème c’est que vous devez envoyer les dates dans le bon format avec une conversion de la date avec ToString pour des Insert/Update.
Cordialement,
- Marqué comme réponse Aurel Bera vendredi 31 mai 2013 10:34
Toutes les réponses
-
ça me semble compliqué de tester une date, si tu as mis un ID unique à chaque ligne de ta BD je te conseille de procéder comme ceci :
Tu mets ta date dans ta textbox, tu recherche l'ID mini qui a la date, et tu prend tout les ID supérieur à cet idée (ça c'est pour le DATE MIN)
Pour le DATE MAX tu fais le contraire, tu rentre la date dans ta textbox, tu prends l'ID max qui a cette date, et ensuite tu prends tout les ID inférieur.
J'avais déjà fait des graphiques en C++, du style Histogramme, j'avais fait ça avec des trait de la fonction dessin, je faisait correspondre la longueur(en pixel) en fonction du critère en absisce de l'histogramme.
Exemple : Longueur en Y = Mesure * nbr_pixel_à_l'echelle_que_tu_veux.
Placement en X = Date * nbr_pixel_à_l'echelle_que_tu_veux.
En gros te faut indiquer 2 points pour tracer une droite, place un point fixe, (celui placé pile sur l'abscice, donc Y=0) et un point fixé en abscisse, mais avec Y variant en fonction de ta mesure.
-
Bonjour
Vous devez ajouter deux paramètres de type date dans la procédures stockée (pas 9), DateStart et DateEnd.
Pur améliorer les performances, ajoutez un index sur la colonne date dans SQL Manager
CREATE INDEX index_name ON table_name (column_name).
Cordialement,
- Modifié Aurel Bera mardi 28 mai 2013 10:39
- Marqué comme réponse Aurel Bera vendredi 31 mai 2013 10:34
-
Dans ma table, mes dates sont au format 'TEXT', car elles sont au format dd/mm/yyyy, et si je sélectionne au format 'DATE', MySql demande un format yyyy/mm/dd, est donc ne prend pas en compte mes date, il les remplace par 0000/00/00. Il faut obligatoirement que mes date soit au format 'DATE' ?
Je ne connais pas les procédures stockées. Pour déclarer les paramètre, il faut bien faire comme ça ?
DECLARE DateStart DATE;
DECLARE DateStop DATE;
je les déclare dans les requêtes SQL de phpmyadmin ?
Pour ajouter un index sur la colonne date, j'ai pu le faire directement via phpMyAdmin dans l'onglet SQL.
-
Le problème c’est que 10/01/2013 et 01/01/2014 comparées comme Texte ont un résultat diffèrent (erronée) que comparées comme Date.
Donc pour avoir le résultat correct on doit transformer la colonne dans des dates soit à l’exécution, avec une fonction de conversion, soit changer le type de la colonne dans la BD.
Je dirais que c’est mieux de les avoir dans la BD comme Date. Appliquer un filtre where sur une fonction (de conversion) pour un grand nombre des lignes dans la table n’est pas une bonne option de point de vue performances.
Le problème c’est que vous devez envoyer les dates dans le bon format avec une conversion de la date avec ToString pour des Insert/Update.
Cordialement,
- Marqué comme réponse Aurel Bera vendredi 31 mai 2013 10:34
-
Si je mets ma colonne date de ma BDD au format 'DATE', après avoir importer mon fichier, il ne prend pas en compte la date il m'écrit 0000-00-00, alors que ma date de mon fichier à la base est par exemple 02/02/2013. Comment faire pour que la colonne prenne en compte ma date au format dd/mm/aaaa ?
A aujourd'hui, ma colonne est donc au format 'TEXT', mais si je fais un insert, ma BDD prend en compte ma date et l'affiche correctement (02/02/2013).
- Modifié Hugo_L mardi 28 mai 2013 14:00
-
Vous utilisez toujours MySqlBulkLoader pour remplir la table?
Cordialement
-
Je n'avais pas réussi a utiliser MySqlBulkLoader pour remplir la table, j'ai donc utilisé : StreamReader pour lire mon fichier texte et la fonction INSERT INTO myTable pour remplir ma table. Solution bien moins performante mais qui m'a permis d'avancer dans mon projet.
-
Bonjour de nouveau
Encore mieux - sera plus facile.
Ici vous avez quelques lignes de code pout transformer un jeu de caractères :
using System.Globalization;
…………………….
CultureInfo provider = CultureInfo.InvariantCulture;
string data = "30-11-2012";
string newData = DateTime.ParseExact(data, "dd-MM-yyyy", provider).ToString("yyyy-MM-dd");
MessageBox.Show(newData);
Donc vous transformez la date dans le format voulu et transformez la colonne en date.
Cordialement,
-
Bonjour, c'est nickel ça, ma table reconnait maintenant ma date au format 'DATE', par contre il m'affiche dans ma colonne date de mon DGV la date comme prevu mais avec l'heure après :
10/02/2012 00:00:00.
j'ai donc essayé une méthode subString mais il m'affiche toujours l'heure.
-
Comment vous avez défini les colonnes dans le DataGridView?
Ici vous avez une image qui vous permet de gérer le style des colonnes :Cordialement,
-
La colonne du DGV est bien au format 'DateTime, type 29/05/2013" comme sur l'image que vous venez de mon montrer, et la colonne de la BDD est au format 'Date' également et non au format 'DateTime', et pourtant l'heure est toujours affiché. Bizarre !
Et peut importe le type de format de colonne du DGV, il m'affiche toujours le même résultat.- Modifié Hugo_L mercredi 29 mai 2013 09:29
-
C'est bien la bonne colonne?
Vous n'avez des colonnes caches qui peuvent décaler le nombre de la colonne modifiée? -
-
La colonne dans le Dataset liée au datagrid est bien aussi de type Date time?
-
Ah non en effet elle est au format 'TEXT' celle ci !
j'ai essayé de "modifier le DataSet à l'aide du concepteur" mais au lieu d'actualiser la table, il en rajoute une, l'ancienne donc, et la nouvelle avec la date au format date. je ne peux pas juste modifier la table sans en avoir une nouvelle ?
-
Ça y est tout est réglé pour la date, ma BDD prend ma date au format date, la colonne date du dataset ainsi que celle du DGV est au format date aussi, plus de soucies pour ça ! Merci d'avoir trouvé d’où venait le problème.
Maintenant, le problème est de déclarer les paramètre DateStart et DateStop dans la procédure stockée. N'ayant jamais fait de procédures stockées, je ne vois pas trop comment faire. Est-ce possible d'avoir une petite explication et/ou un exemple ?
Cordialement.
(ps : je suis passé a la solution MySqlBulkloader pour charger le fichier texte dans ma BDD, je ne trouve pas la différence de rapidité si flagrante, sauf erreur de ma part)- Modifié Hugo_L mercredi 29 mai 2013 11:32
-
Ici vous avez un petit exemple:
http://www.mysqltutorial.org/stored-procedures-parameters.aspx
Cordialement,
-
Bonjour.
J'ai un petit soucie pour récupérer le résultat d'une requête !
Toutes les ligne de ma BDD peuvent être classé en 2 groupes : résultat bon, ou résultat mauvais.
pour les regrouper et les compter je fais donc :
string query = "SELECT 'resultat', COUNT(*) AS nombre FROM 'MaTable' GROUP BY 'resultat' HAVING COUNT(*)";
Cette requête fonctionne impeccable, elle me retourne comme résultat :
résultat - nombre
mauvais - 6148
bon - 21124
pour récupérer le résultat du nombre de "bon" je fais :
mySqlCommand cmd = new mySqlCommand(query, conn); mySqlDataReader dr = cmd.ExecuteReader(); dr.Read(); list[0].add(dr.GetString(1));
donc la je récupère bien la valeur 6148, mais impossible de trouver comment récupérer la secondes valeur (21124) !
Quelqu'un a-t-il une idée ?
Merci, cordialement.
-
Vous devez appeler de nouveau dr.Read() pour avancer à la ligne suivante.
Aussi, faites attention, l'ordre des deux lignes n'est pas garantie. A un instant donnée l'ordré peut se changer.
Donc prenez une décision en fonction de dr.GetString(0) pour récupérer les bons et les mauvaises.
Dans ce cas dr.Read() vas retourner un FALSE et dr.GetString vas élever une exception.
Cordialement,
- Modifié Aurel Bera jeudi 30 mai 2013 14:11
-
Bonjour
On a marqué les réponses pour la question initiale afin que la réponse puisse être trouvée et utilisée
par d'autres membres de la communauté ayant des questions similaires
Cordialement,
-
Bonjour, merci pour le message d'hier ça m'a aidé !
Appeler de nouveau Read() est bien quand la requête retourne un tableau avec peu de lignes, mais dans une autre requête, j'ai en retour un tableau avec des milliers de ligne, comment faire dans ce cas la ? Une boucle ?
Cordialement.
-
Une boucle, evidement.
D'habitude
Cordialementwhile (dr.Read()) {....
}
-
Bonjour, j'ai essayé de ne pas passer par les procédures stockées pour mes date, j'ai donc fait ça :
string date = "SELECT * FROM `resultats mesures` ORDER BY `Date` ASC"; MySqlCommand cmmmd = new MySqlCommand(date, conn); MySqlDataReader dtrd = cmmmd.ExecuteReader(); while (dtrd.Read()) { string dateDebut = mtbDateDebut.Text; string Date = dtrd.GetString(0); DateTime newDate = DateTime.Parse(Date); DateTime newMtbDateDebut = DateTime.Parse(mtbDateDebut.Text); int result = DateTime.Compare(newDate, newMtbDateDebut); if (result >= 0) { string query = "SELECT `Resultat Final`, COUNT(*) AS nombre FROM `resultats mesures` GROUP BY `Resultat Final` HAVING COUNT(*)"; MySqlCommand cmd = new MySqlCommand(query, conn); MySqlDataReader dataReader = cmd.ExecuteReader(); dataReader.Read(); Int32 valeur1 = dataReader.GetInt32(1); string nom1 = dataReader.GetString(0); dataReader.Read(); Int32 valeur2 = dataReader.GetInt32(1); string nom2 = dataReader.GetString(0); dataReader.Read(); Int32 valeur3 = dataReader.GetInt32(1); string nom3 = dataReader.GetString(0); Series serie1 = new Series(); Series serie2 = new Series(); Series serie3 = new Series(); serie1.Points.AddXY(" ", valeur1); serie1.Color = Color.Gray; serie2.Points.AddXY(" ", valeur2); serie2.Color = Color.Green; serie3.Points.AddXY(" ", valeur3); serie3.Color = Color.Red; serie1.ChartArea = "ChA"; serie1.CustomProperties = "DrawingStyle=Cylinder"; serie2.CustomProperties = "DrawingStyle=Cylinder"; serie3.CustomProperties = "DrawingStyle=Cylinder"; Graphique.Series.Add(serie1); Graphique.Series.Add(serie2); Graphique.Series.Add(serie3); dataReader.Close(); dtrd.Close(); } }
Mais bien sur l'utilisation de deux dataReader simultanément ne fonctionne pas. Il y a-t-il un moyen que ça fonctionne quand même ? Ou je dois utiliser ou autre méthode ?
Merci, cordialement.
-
Re Bonjour
Le premier problème que je vois c'est avec la requête SQL:
SELECT `Resultat Final`, COUNT(*) AS nombre FROM `resultats mesures` GROUP BY `Resultat Final` HAVING COUNT(*)";
Il ne retourne qu'une seule ligne.
Essayez de exécuter la requête SQL avec phpmyadmin, inspectez le résultat et après le mettre en c#.
Cordialement
-
Cette requête SQL me retourne le nombre de résultats bon, mauvais, ou non réalisé. de la forme :
résultat - nombre
mauvais - 6148
bon - 21124
non réalisé - 529
Pour moi cette requête ne pose pas de problème, je cherche à connaitre es differents résultats, mais entre les deux date que je rentre (dateDebut, dateFin)
Si je prend en compte mes deux date, mon code devient :
string date = "SELECT * FROM `resultats mesures` ORDER BY `Date` ASC"; MySqlCommand cmmmd = new MySqlCommand(date, conn); MySqlDataReader dtrd = cmmmd.ExecuteReader(); while (dtrd.Read()) { string dateDebut = mtbDateDebut.Text; string Date = dtrd.GetString(0); DateTime newDate = DateTime.Parse(Date); DateTime newMtbDateDebut = DateTime.Parse(mtbDateDebut.Text); int result = DateTime.Compare(newDate, newMtbDateDebut); if (result >= 0) { string dateFin = mtbDateFin.Text; DateTime newDateFin = DateTime.Parse(dateFin); int resultat = DateTime.Compare(newDate, newDateFin); if (resultat <= 0) { string query = "SELECT `Resultat Final`, COUNT(*) AS nombre FROM `resultats mesures` GROUP BY `Resultat Final` HAVING COUNT(*)"; MySqlCommand cmd = new MySqlCommand(query, conn); MySqlDataReader dataReader = cmd.ExecuteReader(); dataReader.Read(); Int32 valeur1 = dataReader.GetInt32(1); string nom1 = dataReader.GetString(0); dataReader.Read(); Int32 valeur2 = dataReader.GetInt32(1); string nom2 = dataReader.GetString(0); dataReader.Read(); Int32 valeur3 = dataReader.GetInt32(1); string nom3 = dataReader.GetString(0); Series serie1 = new Series(); Series serie2 = new Series(); Series serie3 = new Series(); serie1.Points.AddXY(" ", valeur1); serie1.Color = Color.Gray; serie2.Points.AddXY(" ", valeur2); serie2.Color = Color.Green; serie3.Points.AddXY(" ", valeur3); serie3.Color = Color.Red; serie1.ChartArea = "ChA"; serie1.CustomProperties = "DrawingStyle=Cylinder"; serie2.CustomProperties = "DrawingStyle=Cylinder"; serie3.CustomProperties = "DrawingStyle=Cylinder"; Graphique.Series.Add(serie1); Graphique.Series.Add(serie2); Graphique.Series.Add(serie3); dataReader.Close(); dtrd.Close(); } } }
-
Erreur de ma part, j'ai fait une confusion entre ` avec '. Désole.
Utilisez un MySqlDataAdapter - pour récupérer le DataReader dans un DataTable/DataSet.
http://dev.mysql.com/doc/refman/5.0/es/connector-net-examples-mysqldataadapter.html
Et pourquoi ne pas envoyer des MySqlParameters pour envoyer les paramètres ?
http://dev.mysql.com/doc/refman/5.0/es/connector-net-examples-mysqlparameter.html
Cordialement.
- Modifié Aurel Bera lundi 3 juin 2013 10:17