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 :

impossible d'effectuer un cast d'un objet DBNull en d'autres types


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut impossible d'effectuer un cast d'un objet DBNull en d'autres types
    Bonjour les dévs !

    Me voilà parti pour mon dernier programme avant mon épreuve et à ma grande surprise je tombe sur une erreur encore non vue !
    "impossible d'effectuer un cast d'un objet DBNull en d'autres types"
    Je n'explique pas son arrivé car le code que j'utilise est le même (sauf modification de champ) que le code pour une autre Load d'un window Form...

    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
    private void Medicament_Load(object sender, EventArgs e)
            {
                try
                {
                    cbx_liste_medicament.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDown;
                    cbx_liste_medicament.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                    cbx_liste_medicament.AutoCompleteSource = AutoCompleteSource.ListItems;
     
                    CURS curseurInfosMedocs = new CURS(ChaineConnexion);
                    string requeteInfosMedocs = "SELECT * FROM medicament ORDER BY MED_NOMCOMMERCIAL";
                    curseurInfosMedocs.ReqSelect(requeteInfosMedocs);
                    string medDepot, medNom, medFamCode, medCompo, medEffets, medContreIndic;
                    Double medPrix;
                    while (!curseurInfosMedocs.Fin())
                    {
                        medDepot = curseurInfosMedocs.champ("MED_DEPOTLEGAL").ToString();
                        medNom = curseurInfosMedocs.champ("MED_NOMCOMMERCIAL").ToString();
                        medFamCode = curseurInfosMedocs.champ("FAM_CODE").ToString();
                        medCompo = curseurInfosMedocs.champ("MED_COMPOSITION").ToString();
                        medEffets = curseurInfosMedocs.champ("MED_EFFETS").ToString();
                        medContreIndic = curseurInfosMedocs.champ("MED_CONTREINDIC").ToString();
                        medPrix = Convert.ToDouble(curseurInfosMedocs.champ("MED_PRIXECHANTILLON"));
     
                        cbx_liste_medicament.Items.Add(medNom);
     
                        Medicaments unMedoc = new Medicaments(medDepot, medNom, medFamCode, medCompo, medEffets, medContreIndic, medPrix);
                        lesMedics.Add(unMedoc);
     
                        curseurInfosMedocs.suivant();
                    }
                    curseurInfosMedocs.fermer();
                }
                catch (Exception erreur)
                {
                    MessageBox.Show(erreur.Message);
                }
            }
    J'ai vérifié ma "ChaineConnexion" mais la valeur est bien la bonne...

    Merci par avance de votre aide !

    Tanaes.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Petite avancée !

    Je sais que mon erreur est sur mon "Double", quand je mets ces lignes en commentaires tout fonctionne...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //medPrix = Convert.ToDouble(curseurInfosMedocs.champ("MED_PRIXECHANTILLON"));
                        //Medicaments unMedoc = new Medicaments(medDepot, medNom, medFamCode, medCompo, medEffets, medContreIndic, medPrix);
                        //lesMedics.Add(unMedoc);
    Enfin c'est surtout la conversion qui ne fonctionne pas... (je dois mettre les 2 autres lignes en commentaires pour le constructeur)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    La seule solution que j'ai trouvé (en attendant) est de mettre ma variable en "string" tout en changeant mon constructeur...

    Le soucis vient de la base vu que les prix de mes médicaments ne sont pas renseignés, le programme n'ai pas recevoir une valeur null.

    Si vous avez une autre idée que de remplir mes lignes avec des prix bidons, et que de passer ma variable en "string" je suis preneur, sinon merci quand même !

    Tanaes.

  4. #4
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    une petite particularité des requêtages DB c'est que quand tu tombes sur un champ vide (NULL en DB s'entend) il renvoie une valeur particulière : DBNull (c'est un objet dans les faits).
    Celle-ci ne peut être casté qu'en string via sa méthode ToString (qui renverra une chaîne vide) sinon, comme tu l'as vu : erreur.
    A noter également qu'elle est différente du vrai null.

    Pour résumer : pour tout champ NULLABLE non string (VARCHAR, VARCHAR2, TEXT ...) renvoyé par tes requêtes il faut tester s'il est différent de DBNull avant toute manipulation.
    Une autre possibilité (jamais testée) serait de faire des méthodes d'extension à la classe Convert qui surchagerait les fonctions de cast en prenant DBNull comme param. A creuser.

    Bon dev
    Plus je connais de langages, plus j'aime le C.

  5. #5
    Membre actif
    Homme Profil pro
    Developpeur
    Inscrit en
    Février 2013
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Février 2013
    Messages : 180
    Points : 271
    Points
    271
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     ! reader.IsDBNull(reader.GetOrdinal(propriete.Name))
     ? reader[reader.GetOrdinal(propriete.Name)]
     : default(Object))
    propriete.Name correspond au nom du champs à récupérer
    après dans défaut() tu met le type de ton objet (string,int,float,...)

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Merci Jopopmk, je pense que la solution de le récupérer en string va me convenir ! ^^

    Hum merci Ranzoken, je mets ce code avant ma boucle while ?

  7. #7
    Membre actif
    Homme Profil pro
    Developpeur
    Inscrit en
    Février 2013
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Février 2013
    Messages : 180
    Points : 271
    Points
    271
    Par défaut
    non justement c'est au moment de récupérer t'as valeur il faut tester si tu as un null ou non

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    medPrix = Convert.ToDouble(curseurInfosMedocs.champ("MED_PRIXECHANTILLON"))
    deviens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int medPrix = ! reader.IsDBNull(reader.GetOrdinal("MED_PRIXECHANTILLON"))
                      ? reader[reader.GetOrdinal("MED_PRIXECHANTILLON")]
                      : default(int));
    par contre l'exemple donnée "reader" est un objet de type IDataReader qui est le résultat d'une requête

Discussions similaires

  1. Réponses: 21
    Dernier message: 16/09/2013, 22h00
  2. Réponses: 4
    Dernier message: 10/05/2011, 11h55
  3. Réponses: 7
    Dernier message: 26/04/2011, 18h00
  4. Réponses: 0
    Dernier message: 13/03/2010, 10h25
  5. Réponses: 2
    Dernier message: 06/03/2007, 19h38

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