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

MFC Discussion :

pb avec CRecordset::GetFieldValue


Sujet :

MFC

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 10
    Par défaut pb avec CRecordset::GetFieldValue
    bonjour

    voila, j'ai un petit pb au niveau de la recuperation des valeurs contenues dans les champ d'une table de la base de données.

    au fait, je recois un message d'erreur du type "valeur numerique hors limite" en plein milieur d'extraction en l'occurence a l'enregistrement n°8 (548) pour le champ suivant :

    id_soc = 7 7 7 7 7 7 7 548 7

    ou bien un autre message: "Debug Assertion Failed File: afxwin1.inl line: 22" pour un autre champ.

    j'espere que qcq me proposera une solution a ce pb car je suis vraiment bloqué. merci d'avance


    voici le code source :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    #include <afxdb.h>
    #include <iostream.h>
     
    void main()
    {
         CDatabase con;
     
         try
        {
            //connexion à la base de donnée
            if(con.OpenEx(_T( ""),CDatabase::openReadOnly)!=0)
            cout<<"connexion etablie"<<endl;
     
            }
            catch(CDBException *f)
            {
                 AfxMessageBox("connexion dsn : "+f->m_strError);
            }
     
            CRecordset rs(&con);
     
            CString req = "select * from ma_table";
     
            try
            {
     
                rs.Open(CRecordset::dynaset,req);
     
                //On récupère le nombre de champs de la requête
                int nb_champs = rs.GetODBCFieldCount();
     
               //On alloue la memoire pour les champs
               champs = new CString [nb_champs];
     
              while(!rs.IsEOF()) 
              {
                   //on récupère la valeur du champ i
                   try
                  {
                       rs.GetFieldValue("id_pro",champs[0]);
                       cout<<"val : "<<champs[0]<<endl;
                  }
                  catch(CDBException *mon)
                  {
                       AfxMessageBox("getvalue :"+mon->m_strError);
                       exit(0);
                  }
     
                  //On passe à la ligne suivante
                   rs.MoveNext();
            }
     
     
          //on ferme la session de CRecordset
          rs.Close();
       }
       catch(CDBException *e)
       {
            AfxMessageBox("connexion record :"+e->m_nRetCode);
       }
     
       //On ferme la session de CDatabase
       con.Close();
    }
    [ATTENTION aux Balises de code ! Merci:FARSCAPE]

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    champs = new CString [nb_champs];
    Est-ce que tu veux utiliser une liste de CString ??

    Utilise plutôt la collection CStringList c'est bien plus souple , comparable à CObList
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_MFC_CStringList.asp


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rs.GetFieldValue("id_pro",champs[0]);
    Il y a plantage car en fait la variable de type CString champs est initialisée seulement sur... le premier caractêre !!!
    Ce n'est pas la première chaîne de caractêre mais le premier caractêre !
    Voir la doc sur CString

    Passe plutôt par une CString intermédiaire que tu déclares CString strTemp et remplie avec GetFieldValue.
    Après tu l'ajoutes à la collection avec la méthode CStringList::AddHead() ou AddTail().
    Bien effacer tous les éléments alloués à la fermeture de l'application !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 10
    Par défaut
    merci pour ton indication.
    en fait ce que je fait pour l'instant c juste un programe de test, donc les valeurs des champs à extraire seront mis dans un tableau de char* contenu dans un objet defini pour que je puisse l'integrer a mon appli.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 10
    Par défaut pb avec CRecordset::GetFieldValue
    une derniere chose, si dans mon objet CString je n'ai qu'un seul caractere,
    pouquoi pour le champ DATE je recupere bien ces valeurs

    DATE
    -------------------------
    13/04/2004_15:56:38
    13/06/2002_18:20:31
    05/02/2003_08:35:38
    14/09/2004_09:43:49
    25/07/2004_14:05:15
    13/01/2004_19:12:28

    ???

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 10
    Par défaut
    voila, j'ai essayé la solution que tu m'as proposé et j'ai les mêmes erreurs

    si tu as une autre solution ou si une autre personne en a, je suis preneur


    voila le code ajouté:

    //ds le 2eme try
    CString tmp_champs;
    CStringList* champs_list = new CStringList(1000);
    POSITION pos;

    .........

    while(!rs.IsEOF())
    {
    try
    {
    rs.GetFieldValue("MENTITE",tmp_champs);
    champs_list->AddHead(tmp_champs);
    }
    catch(CDBException *mon)
    {
    AfxMessageBox("getvalue :"+mon->m_strError);
    exit(0);
    }

    //On passe à la ligne suivante
    rs.MoveNext();
    }

    //affichage des valeurs recupérées
    for( pos = champs_list->GetHeadPosition(); pos != NULL; )
    {
    cout<<"val : "<<champs_list->GetNext(pos)<<endl;
    }

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 10
    Par défaut

    je sais d'ou venait mon pb c le type des champs que le getfieldvalue() ne connaissait pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme avec Crecordset et l update
    Par Hyunkel92 dans le forum MFC
    Réponses: 2
    Dernier message: 16/05/2007, 11h56
  2. Pb de select avec objet CRecordSet
    Par ep31 dans le forum MFC
    Réponses: 6
    Dernier message: 28/03/2006, 11h16
  3. [MFC] [CRecordset] Problème avec Excel
    Par Yellowmat dans le forum MFC
    Réponses: 4
    Dernier message: 20/07/2005, 15h24
  4. [C++] récup BDD ODBC avec CRecordset
    Par Gothico dans le forum MFC
    Réponses: 6
    Dernier message: 27/10/2003, 11h16
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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