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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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

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