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

Requête SQL et tableau


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut Requête SQL et tableau
    Bonjour,

    Je cherche à récupérer le(s) résultats d'une requête SQL dans un tableau, mais je débute en C et ne sais pas trop comment faire. Voici mon code pour le moment :

    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
    /* On lance la requête... */
    		query = malloc(256+user->lg);
    		sprintf(query,"SELECT bug_id FROM bugs b, users u WHERE b.affecte_a = u.user_id AND b.status = 2 AND u.login = '%s';",user->buf);                      
    		TRACE1("TestFTwithUsername, REQ MySQL : %s\n",query);
    
    if (mysql_query(sock,query))
    		{
    			char *tmp;
    			
    			TRACE2("TestFTwithUsername : Couldn't select to mysql (%s)\n  %s\n",mysql_error(mysql),query);
    			tmp = "E fwcvs: Couldn't find FT in the database.\n";
    			envoiebuf(CLNTOUTPUT,tmp,strlen(tmp));
    			free(query);
    			mysql_close(mysql);
    			return 0;
    		}
    		else
    		{
    		 res = mysql_store_result(sock);
    		 row = mysql_fetch_row(res);
    		 int nblignes = mysql_num_rows(res);
    		 TRACE1("NB Lignes : %d\n", nblignes);  
    		 
    		 for(j = 0; j < nblignes; j++) 
    		 {                          
          sprintf(str,"%s", row[j]);
          TRACE1("STR : %s\n",str);
    		 }                        
    		}
    La partie qui me pose problème est le else ...
    Merci d'avance

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut
    Voilà ce que j'ai fait, après reflexion, est ce correct ? :

    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
    int comparaisonFTs(numFT, res) 
    int numFT; 
    { 
    MYSQL *mysql,*sock; 
    MYSQL_RES *res; 
    MYSQL_ROW row; 
     
    int str[100]; 
    int j,i; 
    int nblignes = mysql_num_rows(res); 
     
    for (j = 0; j < nblignes; j++) 
    { 
    row = mysql_fetch_row(res); 
    sprintf(str,"%s", row[j]); 
    } 
     
    for (i = 0; j < nblignes; i++) 
    { 
    if (numFT = str[i]) 
    { 
    return(1); 
    } 
    else 
    { 
    return(0); 
    } 
    } 
    }
    Cependant cela me dit re redeclared as different kind of symbol, comment faire? Puis previous definition of res was here et ausis passing argument 1 of sprintf from incompatible pointer type ... Sachant que dans ma fonction précédente j'ai récupérer res de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res = mysql_store_result(sock);
    Puis je le passe en paramètre dans l'appel de ma fonction ici présente.

    Quelle est mon erreur? Ma boucle for est-elle correcte?

    Merci d'avance

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 24
    Par défaut
    Bonjour,

    Est-ce qu'il te serais possible de poster ton code complet ?
    Nous venons de terminer la partie SQL en formation et je vais essayer aussi de gérer une base de données en C.
    A 2 on devrait trouver plus rapidement une solution à ton problème

  4. #4
    Membre Expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Par défaut
    Bonjour,

    Déjà pour ton problème de type, c'est l'utilisation de la fonction sprintf.
    Elle se fait en passant comme premier paramètre un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sprintf(char * buffer , const char * format, ...)
    et non un int *.
    Pour ta deuxième erreur, c'est certainement que tu inclues déjà une librairie MySQL qui contient la valeur res déclarée d'un certain type ou que tu as définie cette variable ailleurs dans ton programme.

    Cordialement,
    Christophe

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut
    Mon code a encore changé le voici :

    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
    case 'o':
    		TRACE0("FOLLOW : o \n");
    			if (t != CLNT_TO_SRV)
    			{
    				TRACE0("Le follow 'o' ne doit etre utilise que from_client\n");
    				goto abort;
    			}
          /***** FOLLOW o de commande : On verifie s'il s'agit d'une commande de commit */
     
          if (memcmp(ligne.buf,"ci",2)==0)
          {
    				 if (verificationFTs(&monUserName) == 0)
    				 {
    				 	//FTs OK
    				 }
    				 else
    				 {
    				 	//FTs pas OK
    					char *tmp, str[255], str_numFT[10];
     
    					tmp = "E fwcvs: FT(s) précisé(s) dans la fiche non correct(s) :\n";
    					envoiebuf(CLNTOUTPUT,tmp,strlen(tmp));
     
    					strcpy (str,"E fwcvs: "); 
    					tmp = str + strlen(str);
    					strcpy (str_numFT, "\0");
     
    					/* on précise tous les FTs incorrects */
     
    						strcat(tmp, "\n");
    						envoiebuf(CLNTOUTPUT,str,strlen(str));
     
    	  			  rights = DENIED;
    						order_rights = DENIED;
    				 }
    			}
    Je fais une vérification, si on est dans un "ci" (Check In) alors je vérifie l'exactitude de mes données avec la fonction vérificationFTs que voici :

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    int verificationFTs(user)
    {
    	int TableauFT[100];
      int indexFT, i;
      t_buffer *user;
     
      MYSQL *mysql,*sock;
    	MYSQL_RES *res;/* Structure représentant le résultat d'une requête */
    	MYSQL_ROW row;/* Structure représentant les types d'une ligne de données. Lignes obtenues en appelant mysql_fetch_row() */
     
    	char *query, *pos, *str;
    	int j;
     
    	if ((indexFT =testmafiche(maFiche, TableauFT) )!=0)
    	{
    		// Si on a des FTs
    		//On recherche les FTs compatibles
    		for (i=0; i<indexFT; i++)
    		{
    			/* Test de connexion SQL*/
    			if(mysql = mysql_init(NULL))
    			{
    				if (!(sock = mysql_real_connect(mysql,"localhost","smo","smo","bugSMO",0,NULL,0)))
    				{
    				  char *tmp;
     
    					TRACE1("testFTwithUsername: Couldn't connect to mysql (%s)\n",mysql_error(mysql));
    					tmp = "E fwcvs: Couldn't connect to the database.\n";
    					envoiebuf(CLNTOUTPUT,tmp,strlen(tmp));
    					return 0;
    				}
     
    			  /* On lance la requête... */
    				query = malloc(256+user->lg);
    				sprintf(query,"SELECT bug_id FROM bugs b, users u WHERE b.affecte_a = u.user_id AND b.status = 2 AND u.login = '%s';",user->buf);                      
    				TRACE1("TestFTwithUsername, REQ MySQL : %s\n",query);
     
    				/* mysql_query() Exécute une requête SQL spécifiée en tant que chaîne terminée par un caractère nul.*/
    				if (mysql_query(sock,query))
    				{
    					char *tmp;
     
    					TRACE2("TestFTwithUsername : Couldn't select to mysql (%s)\n  %s\n",mysql_error(mysql),query);
    					tmp = "E fwcvs: Couldn't find FT in the database.\n";
    					envoiebuf(CLNTOUTPUT,tmp,strlen(tmp));
    					free(query);
    					mysql_close(mysql);
    					return 0;
    				}
    				else
    				{
    				 // test réussi on récupère le résultat de la requête dans un tableau
    				  res = mysql_store_result(sock);
    				 	int nblignes = mysql_num_rows(res);
    					int test = mysql_num_fields(res);
     
    				  TRACE2( "num_row = %d et num_fields = %d \n", nblignes, test); 
     
    					row = mysql_fetch_row(res);
     
    					for (j = 0; j < nblignes; j++)
    					{
    						sprintf(str,"%s", row[j]);
    						atoi(NumFTCompatible[j], str);
    						TRACE1("numFTComp : %d\n",NumFTCompatible[j]);
    					}
     
    					for (j = 0; j < nblignes; j++)
    					{
    						if (TableauFT[j] == NumFTCompatible[j])
    						{
    							return(1);
    						}
    						else
    						{
    							return(0);
    						}	
    					}
    				}
    			}
    		}	
      }
    Je balance un peu mon code comme ça, donc si vous le comprenez pas n'hésitez pas à me poser des questions ...
    Il s'agit en fait, de récupérer une commande de commit, une fois récupérée lorsque l'on est dans un "ci" ==> Check In (commande qui envoi le commit) je récupère en fonction de l'utilisateur tous les faits techniques qui lui sont associés et je compare ces faits techniques à ceux récupérés auparavant. Si il y a une erreur (un fait technique qui n'appartient pas à un user) alors je renvoie une erreur lisible par l'user afin qu'il puisse modifier ...


    J'ai un peu de mal à organiser et à créer le code de mon else (deuxième balise code) ... je suis perdue, je débute en C et j'avoue que cette partie du développement est assez ardue à comprendre.

Discussions similaires

  1. Résultat requête SQL dans tableau
    Par hauser11 dans le forum C#
    Réponses: 0
    Dernier message: 16/05/2013, 16h25
  2. affecter une requête SQL à un tableau
    Par gastoncs dans le forum VB.NET
    Réponses: 2
    Dernier message: 22/07/2012, 10h18
  3. Affichage requête SQL dans tableau
    Par lolymeupy dans le forum Langage
    Réponses: 4
    Dernier message: 29/08/2011, 10h40
  4. Requête SQL et tableau
    Par Jiraiya42 dans le forum MVC
    Réponses: 9
    Dernier message: 27/03/2009, 16h12
  5. Requête SQL et tableau à double entrée
    Par Invité dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/06/2007, 20h51

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