Problème index out of range avec des List<T> [Résolu]

Signaler
Messages postés
642
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
-
Messages postés
53
Date d'inscription
jeudi 14 février 2013
Statut
Membre
Dernière intervention
16 juillet 2014
-
Bonjour à tous,

Alors voilà mon soucis. Je cherche à afficher des données provenant d'une base (access) via un select. Dans ma base je n'ai qu'un seul enregistrement avec 4 colonnes et ce sont ces données que je voudrais afficher sur mon interface utilisateur. Pour cela j'utilise les List<T>.
Voici la partie du code qui lève l'exception index out of range :

private List<Sheet> GetSheetsFromDB(OleDbConnection cnx)
        {
            List<Sheet> Sheets = null;
            using (OleDbCommand cmd = cnx.CreateCommand())
            {
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = "SELECT * FROM Fiches_observations";
                using (OleDbDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        Sheet sheet = new Sheet();
                        sheet.SheetId = reader["Fic_id"] == DBNull.Value ? default(int) : int.Parse(reader["Fic_id"].ToString());
                        sheet.ObsDate = reader["Fic_ObsDate"] == DBNull.Value ? default(string) : reader["Fic_ObsDate"].ToString();
                        sheet.ObsObject = reader["Fic_Objet"] == DBNull.Value ? default(string) : reader["Fic_Objet"].ToString();
                        sheet.ObsPlace = reader["Fic_Obsplace"] == DBNull.Value ? default(string) : reader["Fic_ObsPlace"].ToString();
                        Sheets.Add(sheet);
                    }
                }
            }
            return Sheets;


L'exception se lève dans le while à cette ligne :

sheet.SheetId = reader["Fic_id"] == DBNull.Value ? default(int) : int.Parse(reader["Fic_id"].ToString());


Ma connexion à ma base de données est OK.
A force de regarder mon code dans tous les sens + les forums, je me dis qu'un oeil extérieur verra ma bêtise au premier coup d'oeil.

@++

SD

5 réponses

Messages postés
53
Date d'inscription
jeudi 14 février 2013
Statut
Membre
Dernière intervention
16 juillet 2014
9
En principe une exception de ce genre signifie que tu es hors des limite maximal de ta liste, par exemple tu as une collection de 10 éléments et tu cherche à récupérer le 11ème éléments.
Messages postés
14587
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 août 2020
426
Salut, sauf que la ligne ou ça coince ne fait pas appel à la liste.

Je ne connais pas bien les data reader, alors je dis peut etre une bêtise.
Y'a t il bien un champ dans la db qui s'appelle Fic_id, en respetcant la casse?
Si oui, y a t il des valeurs dans ce champs?
Messages postés
642
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
5
Salut wishmeril,

Oui j'ai bien vérifié en base. la première chose que j'ai regardé d'ailleurs. et j'ai bien des données aussi. Je continu de chercher en attendant...merci
Messages postés
642
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
5
En fait wishmeril je crois que ton intuition était bonne. Ma base a bien des données correctes mais elle semblait vérolé. Je n'ai plus la même erreur...merci je continu
Messages postés
14587
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 août 2020
426
Au moment ou ça plante, regarde Sheets.Count, s'il y a autant d'enregistrement que dans ta base, c'est que le reader est allé plus loin que permis.

Tu peux aussi regarder la valeur de reader.HasRows, il y n'a peut être pas de connection.
Messages postés
642
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
5
Merci de ta réponse.
Je sais que je suis hors limite mais je ne comprends pas pourquoi en fait.
En effet, la où l'exception est levée, je ne fais qu'ajouter les valeurs trouvées en base dans chacune des propriétés de mon objet sheet.
Ce que je veux dire c'est qu'ici :

sheet.SheetId = reader["Fic_id"] == DBNull.Value ? default(int) : int.Parse(reader["Fic_id"].ToString());


je ne fais qu'aller lire la valeur qui se trouve dans la colonne Fic_id en base et rien que la je suis out of range !!!!

@++

SD
Messages postés
642
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
5
Merci wishmeril,

Bon ma base n'était pas nette. De plus j'avais oublié un petit new. Bref cela fonctionne presque...j'ai des soucis de binding de textbox maintenant. Je vais encore chercher. Je ne ferme pas mon sujet pour le moment...j'attends de voir si je m'en sors.

merci à vous 2 pour vos pistes

Messages postés
642
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
5
OK. Bon ben j'ai résolu mon problème de databinding maintenant tout est OK.
Je peux fermer cette discussion.

Merci à vous 2 !

@++

SD
Messages postés
53
Date d'inscription
jeudi 14 février 2013
Statut
Membre
Dernière intervention
16 juillet 2014
9
avec plaisir