Partage
  • Partager sur Facebook
  • Partager sur Twitter

executeUpdate ?

Il ne se passe rien

Sujet résolu
    25 septembre 2017 à 15:15:30

    Coucou ! 

    Quelqu'un pourrait me dire où est ma bêtise dans ce code ? 

     *************************************************************

    Dans ma BDD j'ai les tables :

    • classe (idClasse, ..., salle(clé étrangère =nom de la table salle) ).
    • salles (nom, occupe_h1, occupe_h2).
    • disponibiliteClasse (ID, idClasse, ..... , ("h1"|"h2") ).  

    Une salle peut être attribuée à deux classes soit pendant les horaires occupe_h1 ou alors pendant les horaires occupe_h2.

    Si je crée par exemple la classe : 1ere année BTS Marketing, Groupe 01;  que je lui attribue la salle 203 pendant les horaires occupe_h2 

    Dans ma BDD voilà ce qui se passe :

    • classe (idClasse="1 MK 01", ..., salle="203"(clé étrangère =nom de la table salle) ).
    • salles (nom="203", occupe_h1=1, occupe_h2=0).
    • disponibiliteClasse (ID, idClasse="1 MK 01", ..... ,"h1" ).  

     Pour tout ça c'est bon. Mon problème est dans la suppression: 

    Quand je supprime une classe, je dois supprimer la ligne de la table classe, supprimer la ligne de la table disponibiliteClasse (tout ça encore c'est bon aussi !!).

    Mais pour ce qui est de remettre l'attribut occupe_h1=0 ça ne marche pas, la requête ne s’exécute pas

    try {  PreparedStatement requete;
    	  
    	  // 1- réccupérer  occupe= {h1 ou h2} de la table DispoClasse
    	  requete = connexion.createStatement();
      	  resultat = requete.executeQuery("Select occupe from disponibiliteclasse where idClasse ='"+id_classe+"';");
      	  
      	  if (resultat.next()) { h_de_dispoclasse = resultat.getString(1);
      	  						 String x = "occupe_"+h_de_dispoclasse;
      	  
    						  	// 2- mettre à zéro occupe{h1 ou h2} de la table salles
      	  						String sql ="update salles set "+x+" = ? where nom = '"+id_classe+"';";
      	  						requete = connexion.prepareStatement(sql); requete.setInt(1, 0); 
      	  						
      	  						
      	  						//Le problème est là
      	  						requete.executeUpdate(sqlZ);
    							  
    							}
    			
    	}
    
    catch (SQLException p) { JOptionPane.showMessageDialog(null, "ERREUR BDD");}

    Encore merci à ceux qui prennent le temps de lire :) 

    -
    Edité par Leila_10 25 septembre 2017 à 18:21:56

    • Partager sur Facebook
    • Partager sur Twitter
      25 septembre 2017 à 15:48:15

      Salut,

      Quelle problème as-tu exactement ? 

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        25 septembre 2017 à 16:05:20

        Salut,

        Je t'invite à clairement énoncer ton problème et ce que tu as essayé de faire. OC est un forum d'entraide, pas de demande de solution.

        De plus, ton code est très mal indenté et difficile à lire.

        https://openclassrooms.com/forum/sujet/regles-de-ce-forum-a-lire-avant-de-poster-1

        • Partager sur Facebook
        • Partager sur Twitter
          25 septembre 2017 à 16:55:46

          De plus ton code peux être factorisé, car il n'y a que une colonne qui change.
          • Partager sur Facebook
          • Partager sur Twitter
            25 septembre 2017 à 18:25:59

            @ florent m : OK, je vais le faire merci ! 
            @ Artemix : merci, je suis au courant, c'est pour ça que je demande de l'aide, je ne vois pas où tu vois que je demande la solution à quelque chose.
            @ Stig 33 :  Voilà j'ai modifié mon post, j'ai essayé d’énoncer mon problème aussi clairement que possible, j’espère que c'est un peu plus clair 
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              25 septembre 2017 à 19:36:01

              > merci, je suis au courant, c'est pour ça que je demande de l'aide, je ne vois pas où tu vois que je demande la solution à quelque chose.

              Dans ton post original, tu ne montres ni ce que tu as essayé, ni quel était le problème, seulement "aidez-moi svp".

              Ensuite, tu fais une requête concaténée en faisant une requête préparée, pas étonnant que ça ne marche pas. Regarde à nouveau comment faire une requête préparée.

              Ensuite, salles (nom, occupe_h1, occupe_h2). avoir comme clé primaire un varchar n'est pas génial... Indexation lente, référence très lourde en mémoire et d'autres problèmes.. Pareil pour les status occupés: Ce n'est pas à la salle de savoir si elle est occupée, mais au système qui gère les salles.

              • Partager sur Facebook
              • Partager sur Twitter
                26 septembre 2017 à 9:01:15

                Tu peux faire la concaténation uniquement pour le champs, par contre les valeurs ne doivent en aucun cas être concaténé (problème injection SQL), mais bien utilisé les marqueur anonyme dans ta requête (le "?") et pour finir pas de point virgule à la fin de tes requêtes.

                try {  
                	PreparedStatement requete;
                
                	// 1- réccupérer  occupe= {h1 ou h2} de la table DispoClasse
                	requete = connexion.createStatement();
                	
                	//REMARQUE FLORENT
                	//- Pas de point virgule dans la fin de la requête
                	//- Utilisé un prepare Statement et aussi un marque anonyme pour l'id_classe
                	//- Mettrent la string de la requête en attribut de classe constante (final static)
                	resultat = requete.executeQuery("Select occupe from disponibiliteclasse where idClasse ='"+id_classe+"';");
                
                	if (resultat.next()) { 
                		
                		h_de_dispoclasse = resultat.getString(1);
                		String x = "occupe_"+h_de_dispoclasse;
                
                		//REMARQUE FLORENT
                		//---Factorisé en une sous méthode--
                		
                		//2 - mettre à zéro occupe{h1 ou h2} de la table salles
                		
                		//REMARQUE FLORENT
                		//- Pas de point virgule dans la fin de la requête
                		//- Utilisé un prepare Statement donc on utilise un marquer anonyme ("?")
                		String sql ="update salles set "+x+" = ? where nom = '"+id_classe+"';"; 
                		requete = connexion.prepareStatement(sql); 
                		requete.setInt(1, 0);
                
                		//Le problème est là
                		requete.executeUpdate(sqlZ);
                		
                		//REMARQUE FLORENT
                		//---Factorisé en une sous méthode--
                		
                	}
                
                }
                catch (SQLException p) { 
                	JOptionPane.showMessageDialog(null, "ERREUR BDD");//Le must serait de rajouter un loggeur pour afficheer l'exception dans les log
                }



                En corrigeant toutes les remarques, cela devrait fonctionner et être plus propre.

                -
                Edité par florent m 26 septembre 2017 à 9:02:31

                • Partager sur Facebook
                • Partager sur Twitter
                  27 septembre 2017 à 0:46:08

                  Mercii !

                  -
                  Edité par Leila_10 27 septembre 2017 à 0:46:23

                  • Partager sur Facebook
                  • Partager sur Twitter

                  executeUpdate ?

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown