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

Visual C++ Discussion :

Cast de variante vers le type long


Sujet :

Visual C++

  1. #1
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut Cast de variante vers le type long
    Bonjour,

    J'ai un soucis que je n'arrive pas à comprendre dans le cast d'un variant contenant un entier long vers un type "long"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           DataTypeEnum nDataType = (DataTypeEnum)(long) FieldsPtr->GetItem("DATA_TYPE")->Value;
           _variant_t vtLong = FieldsPtr->GetItem("CHARACTER_MAXIMUM_LENGTH")->Value;
           long iLongueur = 0;
           if(vtLong.vt != VT_NULL)
               iLongueur = (long)vtLong;
    Comme vous le voyez, je travaille avec une base de données et ADO comme interface !!
    Ce code marche avec Sql Server mais avec oracle par ex, il y a erreur lors du "iLongueur = (long)vtLong", cela est capturé avec un try...catch... plus exactement lorsque vtLong est une grande valeur car nDataType = adBinary (le type binaire en base de données).
    Je ne sais si vous avez déja rencontré un tel cas, que faire

  2. #2
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    Pour reformuler ma question, pourquoi un cast de _variant_ contenant un type VT_R8 cause une exception mais pas sous sql server? Il s'agit de C++ car c'est du _variant_
    Ou comment faire un cast plus sur du type variant?

    => Conversion VT_R8 en VT_INT ou VT_I64

  3. #3
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    Bien que le résultat obtenu par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _variant_t vtLong = FieldsPtr->GetItem("CHARACTER_MAXIMUM_LENGTH")->Value;
    est une variante de type VT_R8 pour SQL Server (type IMAGE) et pour Oracle (type BLOB), faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iLongueur = (long)vtLong;
    Ca marche pour SQL Server mais pour Oracle, il faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iLongueur = (long)vtLong.dblVal;
    Quelqu'un pourrait-il m'expliquer le fait que sans .dblVal ça marche pour le cas de sql server

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Sans doute le type _variant_t a-t-il une fonction de conversion vers long...

  5. #5
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    C'est résolu maintenant avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iLongueur = (long)vtLong.dblVal;
    Mais ce que je ne comprends pas c'est le fait que sous sql server, il suffit juste de (long)vtLong et ça marche alors que c'est du VT_R8 pour sql server et pour Oracle !!

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Ce que je conseillerais, c'est vérifier dans le programme que c'est vraiment du VT_R8 quand tu es sous sql server...

  7. #7
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    Oui, c'est vraiment du VT_R8, le fait que le cast tout court du variant pour sql server marche correctement, c'est surement lié au type IMAGE mais je comprends pas.
    Mais en utilisant .dblVal, j'obtiens un WARNING de conversion DOUBLE vers long lors de la compilation, que faire pour éviter ça ?

Discussions similaires

  1. Cast vers un type plus grand et perte de precision
    Par Kaluza dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2012, 11h12
  2. cast d'un objet vers des types dynamiques
    Par aymen007 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 25/06/2008, 09h31
  3. select sur un champ de type LONG
    Par ppd dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2004, 18h19
  4. DBLink et types LONG/LONG RAW
    Par bchristo dans le forum Administration
    Réponses: 7
    Dernier message: 28/04/2004, 12h46
  5. DATABASE LINK + type Long et long raw ...
    Par bchristo dans le forum Administration
    Réponses: 21
    Dernier message: 26/04/2004, 15h27

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