Probleme : format du resultat de la requette mysql avec c++

Signaler
Messages postés
27
Date d'inscription
mardi 25 mars 2003
Statut
Membre
Dernière intervention
12 novembre 2012
-
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
-
Bonjour tout le monde,
je suis entrain de développe un programme en c++ avec visual studio 2003 qui doit crée des objets, je récupéré les valeurs des variables des objets dans une base de donnée mysql.
mon programme arrive a ce connecte a la base, il récupéré les données sans problème apparent.
Mais dans une des méthodes j'utilise la valeur d'un résultat d'une des requête que j'affecte a un int, et j'utilise cette variable pour crée une seconde requête. le problème est que la valeur que je récupéré est sous la forme "0x00000001" pour une valeur dans la table égale a "1".
et l’exécution de mon programme s’arrete et visuall me renvoi le message suivant :
"Exception non gérée à 0x58b387b8 dans test.exe:0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xccccd07c."

donc ma question est comment je peut faire pour modifie la représentation d'un int de la forme "0x00000001" on une représentation simple '1".
voici la méthode en question :

la variable qui me pose problème et Matiere_Id que j'utilise dans la deuxième requête.
(désolé, je sais que mon code n'est pas optimal mais j'essaye d’arrivé a un résultat c tout)
void CConnexion::Remp_Course_Class()
{
MYSQL_RES *res, *res1;
MYSQL_FIELD *fd, *fd1;
UINT num_fields, num_fields1;
MYSQL_ROW row, row1;
UINT i = 0;
UINT j = 0;
UINT k = 0;
int nb_seance1,nb_seance2;
nb_seance1=0;
nb_seance2=0;

int CourseClass_Id=0;
int ID=0;
int Class_Id, Matiere_Id, Prof_Id, duree, nb_h_total, nb_h_groupe, nb_h_lab, nb_h_max, nb_h_min, priorite,
periode_prefere;
bool CourseClass_Lab;
time_t CourseClass_modifie_le;
CString CourseClass_modifie_par;	

if (IsConnected)
{
if (( mysql_query(myData, "SELECT * FROM matiere_classe") == 0))
{
res = mysql_store_result(myData);
num_fields = mysql_num_fields(res);
fd = mysql_fetch_fields(res);
while ( (row = mysql_fetch_row(res)))
{				
for (j = 0; j < num_fields; j++)
{
switch ( j )
{
case 0 :
break;
case 1 :
Class_Id = atoi(row[j]);
break;
case 2 :
{
Matiere_Id = atoi(row[j]);
break;
}
case 3 :
Prof_Id =  atoi(row[j]);
break;
case 4 :
{
CString temp =  row[j];
CourseClass_Lab = (temp=='1');			
break;
}
case 5 :
CourseClass_modifie_le = atol(row[j]);
break;
case 6 :
CourseClass_modifie_par = row[j];
break;
default:
break;
}
}

if (( mysql_query(myData1, "SELECT * FROM matiere WHERE ID=Matiere_Id") == 0))
{
res1 = mysql_store_result(myData1);
num_fields1 = mysql_num_fields(res1);
fd1 = mysql_fetch_fields(res1);
row1 = mysql_fetch_row(res1);				
for (k = 0; k < num_fields; k++)
{
switch ( k )
{
case 5 :
nb_h_total = atoi(row1[k]);
break;
case 6 :
nb_h_groupe = atoi(row1[k]);
break;
case 7 :
nb_h_lab =  atoi(row1[k]);
break;
case 8 :
nb_h_max =  atoi(row1[k]);
break;
case 9 :
nb_h_min = atoi(row1[k]);
break;
case 10 :
priorite = atoi(row1[k]);
break;
case 11 :
periode_prefere = atoi(row1[k]);
break;
default:
break;
}
CourseClass* tmp_CourseClass = new CourseClass(ID, Class_Id, Matiere_Id, Prof_Id, 
CourseClass_Lab, duree, nb_h_total, nb_h_groupe, nb_h_max, nb_h_min, priorite,
periode_prefere, CourseClass_modifie_le, CourseClass_modifie_par);
_courseClasses.push_back( tmp_CourseClass );
}
mysql_free_result(res);
}
}
}
else  // Something went wrong
{
fprintf (stderr,"Error  mysql_errno" , mysql_error (myData));
}
}
else  // Something went wrong
{
fprintf (stderr,"Error  mysql_errno" , mysql_error (myData));
}
}



Merci beaucoup pour votre aide

1 réponse

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
Salut,
Il y'a une erreur dans ta deuxième requête. On ne peut pas mettre le nom de la variable dans la requête. Il faudrait la construire dans un buffer pour pouvoir y mettre la valeur de ton entier récupéré. Exemple:
char szrequete[200];
strcpy(szrequete,"SELECT * FROM matiere WHERE ID=");
itoa(Matiere_Id,szrequete+strlen(szrequete),10);
if (mysql_query(myData1,szrequete)==0)
{
    //...
}

Ton code plante car, suite à l'exécution de ta deuxième requête, tu appelles mysql_fetch_row() sans t'assurer que res1 est valide. Puisque la requête n'est pas correcte, res1 ne sera pas valide. Ainsi, row1 ne sera pas valide non plus. En essayant d'accéder à row1, ton programme plantera.
Essaie d'organiser ton code comme ceci:
res1 = mysql_store_result(myData1);
if(res1)
{
    num_fields1 = mysql_num_fields(res1);
    fd1 = mysql_fetch_fields(res1);
    row1 = mysql_fetch_row(res1);
    if(row1)
    {
        for (k = 0; k < num_fields; k++)
        {
            //...
        }
    }
}