IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Erreur de cast


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Erreur de cast
    Bonjour à tous,

    Depuis plusieurs jours je bloque sur une partie de mon code. Je pense que c'est un problème d'unboxing...
    Je n'arrive pas a "transformer" l'object que je reçois de ma bdd en variable de type double.

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //Charge les Praticiens.
                maCo.Open();
                string sqlPraticien = "Select p.*, t.* from praticien p, type_praticien t where p.TYP_CODE = t.TYP_CODE";
                MySqlCommand commandPraticien = new MySqlCommand(sqlPraticien, maCo);
                MySqlDataReader readerPraticien = commandPraticien.ExecuteReader();
     
                while (readerPraticien.Read())
                {
                    TypePracticien seekTypePracticien = new TypePracticien(readerPraticien[8].ToString(), readerPraticien[9].ToString(), readerPraticien[10].ToString());
                    chargerPracticien.Add(new Practicien((int)readerPraticien[0], readerPraticien[1].ToString(), readerPraticien[2].ToString(), readerPraticien[3].ToString(), readerPraticien[5].ToString(), readerPraticien[4].ToString(), (double)readerPraticien[6], seekTypePracticien));
                }
                maCo.Close();
    Voici l'erreur que j'obtient:


    Ce que je ne comprend pas c'est que dans ma bdd, mon champ est de type double et visual studio me dit qu'il reçoit un object{double}. Je ne comprend pas trop.
    J'ai testé pas mal de choses comme caster plusieurs fois l'objet, mais rien n'y fait...

    Merci pour votre future aide

    PS: mon constructeur Praticien() attend: int, string, string, string, string, string, double, TypePraticien().

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 93
    Points : 169
    Points
    169
    Par défaut
    Salut,

    Essaye de faire un Convert.ToDouble(). Ou alors tu as un NULL dans la colonne. Une pratique courante est de se faire une classe static du genre DBHelper, avec par exemple une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double GetDouble(object pObject, double pValueIfNull)
    Au passage, c'est une très mauvaise pratique de faire des select * ! Le jour où tu insères une nouvelle colonne tout fout l'camp ! Et il me semble que la norme SQL n'impose pas à * de retourner les colonnes dans le bon ordre, même si je n'ai jamais vu de contre exemple...

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Jaco67 Voir le message
    Essaye de faire un Convert.ToDouble(). Ou alors tu as un NULL dans la colonne. Une pratique courante est de se faire une classe static du genre DBHelper, avec par exemple une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double GetDouble(object pObject, double pValueIfNull)
    J'ai déjà testé Convert.ToDouble(), cela me renvois exactement la même erreur.
    Peut être que je me trompe et que le problème ne viens pas de ce champs, mais dans ce cas, je ne vois vriament pas d'ou ca pourrait venir..

    Au passage, c'est une très mauvaise pratique de faire des select * ! Le jour où tu insères une nouvelle colonne tout fout l'camp ! Et il me semble que la norme SQL n'impose pas à * de retourner les colonnes dans le bon ordre, même si je n'ai jamais vu de contre exemple...
    Ha oui, je n'avais pas pensé à ça :s Je modifie de ce pas.
    C'est vrais que si jamais les données ne sont pas retournées dans le bon ordre, il risque d'y avoir des erreurs de cast...
    Merci pour ta réponse rapide. En esperant trouver la solution rapidement

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    Essaye TryParse.

    Tu vas pouvoir au moins inspecter ce qui se passe.

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    La solution de BabyNeedle devrait résoudre le problème en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Double.TryParse(readerPraticien[6].ToString, out MyDouble)
    Le problème vient des types retournés par l'interface de la database qui dépendent de la dataBase (MySQL, Oracle, Access, ...) et sont souvent différent des types system du C#.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Hello,
    la ligne où se produit l'erreur contient de nombreuses instructions (un cast en int, un autre en double, plusieurs ToString, ...)

    D'après ton screenshot, le point d'arrêt sur readerPraticien[6] dit que son type est bien double, donc il ne doit pas y a voir d'erreur.

    Elle ne serait plutôt sur le cast en int, ton erreur ?

    Sinon, pour résoudre ce genre de problème seul: l'essence du débugage consiste à isoler les problèmes. Là, je te conseille de passer par des variables temporaires, comme ça par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var id = (int)readerPraticien[0];
    var name = readerPraticien[1].ToString();
    ....
    chargerPracticien.Add(new Practicien(id, name, ..., ));
    ಠ_ಠ

Discussions similaires

  1. Erreur de cast sur les generics!
    Par Razgriz dans le forum Général Java
    Réponses: 8
    Dernier message: 02/10/2007, 18h33
  2. erreur de cast
    Par fafou1008 dans le forum Langage
    Réponses: 2
    Dernier message: 08/05/2007, 14h28
  3. erreur de cast
    Par trueman dans le forum ASP.NET
    Réponses: 2
    Dernier message: 24/03/2007, 14h16
  4. Erreur "specified cast is not valid"
    Par [DreaMs] dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 30/01/2006, 21h15
  5. [Delphi.Net] Erreur de Cast ?
    Par SubZero2 dans le forum Delphi .NET
    Réponses: 15
    Dernier message: 11/07/2005, 17h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo