Le format de chaîne d'entrée est incorrect

Résolu/Fermé
beaulem_5904 Messages postés 10 Date d'inscription dimanche 14 novembre 2021 Statut Membre Dernière intervention 13 juillet 2022 - 12 juil. 2022 à 20:05
Whismeril Messages postés 18939 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 février 2024 - 13 juil. 2022 à 07:39

Je traite un fichier gedcom (fichier éditable avec bloc-notes) pour le convertir en données SQL. Je lis les lignes du fichier et je divise les informations en différentes tables. l'une de ces tables accepte un certain nombre d'entrées avant de me donner l'erreur : Le format de chaîne d'entrée est incorrect.

 // lecture d'une ligne du gedcom
                string gedCol1 = ((GedCom)lstGed.Items[i]).colNo1;
                string gedCol2 = ((GedCom)lstGed.Items[i]).colNo2;
                string gedCol3 = ((GedCom)lstGed.Items[i]).colNo3;

else if(gedCol2 == "NOTE")
                        {
                            gedType = "NOTE";
                            ajoutNote(gedCol3, lstInIndi);
                        }

 public void ajoutNote(string note, string numberIndi)
        {
            MessageBox.Show("Entre : " + note);
            bool strTrouve = false;
            int j = 0;

            if(lstDeNote.Items.Count > 0)
            {
                /* initialisation de la recheche */
                string l4col1 = ((Note)lstDeNote.Items[j]).numNote;
                string l4col2 = ((Note)lstDeNote.Items[j]).numIndi;
                for (j = 0; j < lstDeNote.Items.Count; j++)
                {
                    /* Parcourir l'ensemble de la liste pour trouver
                        * le même numéro d'individu s'il est trouvé j'ajoute la
                        * note supplémentaire à la note existante et je sort de la boucle */
                    if (string.Equals(l4col2, numberIndi))
                    {
                        strTrouve = true;
                        ((Note)lstDeNote.Items[j]).txtNote = ((Note)lstDeNote.Items[j]).txtNote + note;
                        return;
                    }
                    /* Intialise la recherche suivante  */
                    l4col1 = ((Note)lstDeNote.Items[j]).numNote;
                    l4col2 = ((Note)lstDeNote.Items[j]).numIndi;

                }
                /* Si recherche terminé et note pas trouvé insert le nouveau  */
                if (strTrouve == false)
                {

                    l4col1 = (j + 1).ToString();
                    //MessageBox.Show("Note trouvée : " + l4col1 + " : " + note);
                    lstDeNote.Items.Add(new Note
                    {
                        numNote = l4col1,
                        numIndi = numberIndi,
                        txtNote = note
                    });
                    
                    return;
                }
            }
            else
            {
                /* Si aucune note trouvé dans la liste insert la nouvelle */
                if(strTrouve == false)
                {
                    lstDeNote.Items.Add(new Note
                    {
                        numNote = "1",
                        numIndi = numberIndi,
                        txtNote = note
                    });
                }
            }
        }

4 réponses

jordane45 Messages postés 38038 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 février 2024 4 622
12 juil. 2022 à 22:20

Bonjour, 

'une de ces tables accepte un certain nombre d'entrées avant de me donner l'erreur : Le format de chaîne d'entrée est incorrect.

Et.. as tu essayé de déterminer sur quelle ligne de ton fichier se posait le problème ? quelle est cette donnée dans le "mauvais" format ?


.
Cordialement,
Jordane

0
Whismeril Messages postés 18939 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 février 2024 921
Modifié le 12 juil. 2022 à 23:55

Bonsoir

 // lecture d'une ligne du gedcom
                string gedCol1 = ((GedCom)lstGed.Items[i]).colNo1;
                string gedCol2 = ((GedCom)lstGed.Items[i]).colNo2;
                string gedCol3 = ((GedCom)lstGed.Items[i]).colNo3;

else if(gedCol2 == "NOTE")
                        {
                            gedType = "NOTE";
                            ajoutNote(gedCol3, lstInIndi);
                        }

Pourquoi, alors que manifestement, la liste lstGed contient des instance d'une classe appelée GedCom, avec des propriétés correspondant à des colonnes, tu copies les valeurs dans des string pour ensuite en tester la valeur dans un else if (sans if avant...)

Ça me parait aberrant.

Ceci ne serait pas plus logique?

 // lecture d'une ligne du gedcom
                GedCom laLigne = (GedCom)lstGed.Items[i]);

if(laLigbe.colNo2 == "NOTE")
                        {
                            gedType = "NOTE";
                            ajoutNote(laLigbe.colNo3, lstInIndi);
                        }

En plus tu te sers de listbox (ou d'un autre contrôle de ce genre) pour stocker tes données, c'est une mauvaise pratiques.

Tes données devraient être stockées dans des collections (list<T> par exemple) et les contrôles ne devraient servir qu'à l'affichage (par le binding par exemple)

Et donc, si tu avais des collections, tu pourrais faire des requêtes linq ce qui est à la fois plus simple à coder et plus rapide d'exécution pour trouver l'individu à qui tu dois ajouter une note.


Quand j'étais petit, la mer Morte n'était que malade.
George Burns

0
beaulem_5904 Messages postés 10 Date d'inscription dimanche 14 novembre 2021 Statut Membre Dernière intervention 13 juillet 2022
13 juil. 2022 à 00:59

La ligne qui bloque est : Ils ont eu 10 enfants.

0
Whismeril Messages postés 18939 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 février 2024 921
Modifié le 13 juil. 2022 à 07:39

OK.

Mais vois tu dans les extraits de code que tu as posté, on ne voit pas comment cette ligne est lue dans le fichier ni comment elle est envoyée à sql.

Et puis pour avoir une idée de comparaison, un exemple de ligne qui marche serait bien aussi.


Quand j'étais petit, la mer Morte n'était que malade.
George Burns

0