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++Builder Discussion :

Erreur Access Violation : API mySQL et Builder 6


Sujet :

C++Builder

  1. #1
    Invité
    Invité(e)
    Par défaut Erreur Access Violation : API mySQL et Builder 6
    Bonjour

    Je dois, pour un TP, développer un application sous Builder(6) utilisant l'api mySQL.
    Dans celui-ci, je dois à un moment lister les tables d'une base de donnée dans une ListBox. Selon le choix de l'utilisateur, le système affichera dans une deuxième ListBox la liste des champs (leurs noms) correspondant à la sélection.
    Pour faire simple :

    ListBox1 = nom des tables
    ListBox2 = nom des champs de la table sélectionnée (par double-clic)

    Le soucis viens de la récupération des noms des champs. Lors du double-clic, le programme plante en affichant le message d'erreur suivant :
    Violation d'accès à l'adresse xxxxxx dans le module 'rtl60.bpl'. Lecture de l'adresse yyyyyy
    Je vous met le morceau de code générant l'erreur ci-dessous :
    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
    AnsiString selection = ListBox1->Items->Strings[ListBox1->ItemIndex];
    AnsiString requete = "SELECT * FROM ";
    requete += selection;
     
    char* requeteChar = requete.c_str();
     
    if(!mysql_query(mySQL, requeteChar))
    {
         myRES = mysql_store_result(mySQL);
     
         if(myRES)
         {
              compteur = mysql_num_fields(myRES);
              myFIELDS = mysql_fetch_fields(myRES);
     
               for(int i=0 ; i<compteur ; i++)
               {
                    resultat = myFIELDS[i].name; // ligne générant l'erreur
                    ListBox2->Items->Add(resultat);
               }
           }
    }
    J'ai tout essayé : cast pour voir si ça venait du type, conversion char*->AnsiString... rien n'y fait.
    Merci d'avance
    Dernière modification par Invité ; 07/11/2008 à 17h03.

  2. #2
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Salut,
    as mon avis, vu la ligne de code générant l'exception et sont emplacement, tu dois avoir un débordement de tableau, ton i doit être plus grand que la capacité de ton tableau et donc tu accède à une adresse mémoire foireuse et dont tu n'as pas les droits.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Pourtant, la variable "compteur" correspond au nombre de champs dans la table. Du coup, logiquement, je ne devrais pas avoir de débordement...
    Je viens d'essayer de parcourir la tableau avec i-1, mais ça revient au même.


    Edit : j'ai oublié de préciser que pour myFIELDS[i].type, il n'y a aucune erreur. Ça fonctionne correctement, tant que le retour de myFIELDS[i].xxx n'est pas un char*

  4. #4
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    au lieu de mettre ta variable resultat en AnsiString essaye en la mettant en std::string (ne pas oublier de faire le #include <string>), si l'API mySql à des problème avec l'AnsiString comme tu le dit ca peut venir de la.

    C'est tu au bout de combien de passage dans ta boucle cela plante ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je vais essayer ça.
    Pour le nombre de passage, je ne peux pas te dire exactement. En mode pas-à-pas, ça semble planter dès le premier passage.

  6. #6
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Cela me semble logique que ca plante au premier passage si les AnsiString sont en cause

  7. #7
    Invité
    Invité(e)
    Par défaut
    Cool, ça génère une nouvelle erreur !

    Toujours une violation d'accès, mais dans le module "CC3260MT.dll" cette fois ci.
    J'ai remplacé la boucle for précédente par celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for(int i=0 ; i<compteur ; i++)
    {
        resultatSTDString = myFIELDS[i].name; // Mémorasation dans un variable std::string
        resultat = AnsiString(resultatSTDString.c_str()); // Passage std::string->AnsiString
        ListBox2->Items->Add(resultat); // Ne prend que de l'AnsiString
    }

  8. #8
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    C'est tu quel ligne fait planter et combien valais i au moment du plantage ?

  9. #9
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonsoir,

    Une petite question au passage, juste pour m'éclairer:
    "resultat" est de quel type ? Je ne le vois déclaré nulle part dans le code du premier message, il doit être "en dehors" de la partie copiée surement.

    @+

  10. #10
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    C'est un AnsiString

  11. #11
    Invité
    Invité(e)
    Par défaut
    C'est tu quel ligne fait planter et combien valais i au moment du plantage ?
    Alors, cette ligne (toujours la même) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultatSTDString = myFIELDS[i].name;
    plante au second passage dans la boucle.
    Pour le premier passage, resultat et resultatSTD valent bien le nom du premier champ de la table choisie
    Par contre, dès le deuxième passage : plantage (i = 1).

    Désolé pour le temps entre chaque réponse.

  12. #12
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Citation Envoyé par Furanku Voir le message
    Alors, cette ligne (toujours la même) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultatSTDString = myFIELDS[i].name;
    plante au second passage dans la boucle.
    Pour le premier passage, resultat et resultatSTD valent bien le nom du premier champ de la table choisie
    Par contre, dès le deuxième passage : plantage (i = 1).
    On dirai bien que c'est un dépassement de tableau, mais le fait que ça fonctionne avec les propriété non char* prouve que non, c'est très bizarre, peut-être un problème au niveau de l'API mySql qui aurait un bug mais je n'y croit pas trop, il y aurai plus de monde qui aurai ce problème

    Citation Envoyé par Furanku Voir le message
    Désolé pour le temps entre chaque réponse.
    Ce n'est rien, le forum est fait pour résoudre les problème à la vitesse que chacun le souhaite

  13. #13
    Invité
    Invité(e)
    Par défaut
    J'ai oublié de préciser que même si resultat prend bien la valeur au premier passage, cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListBox2->Items->Add(resultat); // Ne prend que de l'AnsiString
    n'affiche pas pour autant le 1er résultat dans la ListBox...
    Un dépassement de mémoire, j'y ai pensé aussi, mais je ne vois pas trop où il pourrait être puisque "compteur" correspond au nombre de champs dans ma table.
    A la limite, s'il était plus grand, mais là...

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Question tu as bien mis en tout premier include et j insiste bien sur premier

    #include <windows.h>

    ??

  15. #15
    Invité
    Invité(e)
    Par défaut
    Chose faite, ça ne change rien

  16. #16
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    chose toute bete , tu as fait un test de connection ou recuperer des données dans une table ?

  17. #17
    Invité
    Invité(e)
    Par défaut
    Pas de soucis pour l'accès à la base.
    J'ai une première ListBox qui me liste convenablement l'ensemble des tables. De même, je peux récupérer y les informations sans problème. Par contre pour le nom des champs... bah voilà quoi

  18. #18
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut Furanku
    Je ne connais pas mySQL mais sur le site j'ai trouve ce lien
    et pour recuperer les noms de champs
    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
    7. Lister la structure d'une table 
     
    MYSQL *mySQL;
    MYSQL_RES *myRES;
    MYSQL_FIELD *myFields;
    AnsiString aStr;
    int CountFields;
     
    if (!mysql_query(mySQL, "select * from testbcb")) {
        myRES = mysql_store_result(mySQL);
        if (myRES) {
            CountFields = mysql_num_fields(myRES);
            myFields = mysql_fetch_fields(myRES);
            for(unsigned int i = 0; i < CountFields; i++) {
                aStr.sprintf("Field %s is type %d",myFields[i].name, myFields[i].type);
                ListBox1->Items->Add(aStr);
            }
        }
        mysql_free_result(myRES);
    }
    La fonction mysql_fetch_fields remplit une structure de type MYSQL_FIELDS qui contient alors un tableau contenant toutes les informations des champs renvoyés par la requête.
    je crois qu'il te manque le type du champ
    myFields[i].name, myFields[i].type);

  19. #19
    Invité
    Invité(e)
    Par défaut
    Non, je ne pense pas. myFields[i].type sert bien à récupérer le type du champ, mais je n'en ai pas l'utilité.
    J'ai déjà fait ce tuto, et justement cette ligne plantait elle aussi lors de la récupération des noms. Pour le listage des types aucun soucis

  20. #20
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bon, ben ... question conne: rien de spéciale dans le nom des champs ?
    Caractéres "spéciaux", taille du nom, etc ...

    Je dis ca, mais je sais que si c'était le cas ca aurait du planter dès la création de la table, m'enfin, vaut mieux "checker" éventuellement, au cas ou.

    @+

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [OCILIB] OCI_LobRead erreur Access violation writing location
    Par capic dans le forum Interfaces de programmation
    Réponses: 3
    Dernier message: 05/12/2011, 08h52
  2. problèmes Socket erreur : Access violation
    Par milanoran dans le forum C++
    Réponses: 5
    Dernier message: 24/10/2010, 14h15
  3. erreur "ACCESS VIOLATION"
    Par sacha400 dans le forum Collection et Stream
    Réponses: 0
    Dernier message: 14/04/2010, 18h34
  4. Réponses: 3
    Dernier message: 29/12/2009, 18h22
  5. [Lazarus] [0.9.27] Erreur access violation avec TCalendar
    Par ovni76 dans le forum Lazarus
    Réponses: 5
    Dernier message: 22/07/2009, 12h17

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