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

 Java Discussion :

Ecriture en base de requêtes SQL qui pose problème (se multiplient anormalement)


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2018
    Messages : 3
    Par défaut Ecriture en base de requêtes SQL qui pose problème (se multiplient anormalement)
    Bonjour la communauté,

    Je vais vous exposer mon problème.

    Sur un projet perso, je possède 1 classe java qui me sert de vue; un controller qui y est associé; et 1 classe de type 'launcher' qui me permet d'ouvrir la vue via un clic sur bouton.

    J'utilise comme SGBD Postgre SQL et son dernier dernier driver à jour.

    Mon problème :

    Lorsque je lance ma nouvelle vue via mon launcher avec un myView view = new myView(), j'arrive sur l'interface de ma deuxième vue; jusque-là, aucun soucis.

    Lorsque j'intéragi avec cette vue, par exemple que je créé un nouveau fichier .xml, que je parse ses infos et que je les rentre en base, tout marche bien encore. Ca ce complique quand je veux refaire la même manipulation, ou toute autre manipulation pour écrire en base de données. En effet, mon action est réalisée 2 fois. Puis si je refais une manip d'écriture en base, ça bouclera 3 fois. Et ainsi de suite. Voici un résultat :
    Nom : image.png
Affichages : 146
Taille : 28,3 Ko

    Dans mon controller, certaines requêtes sont en prepared statement, d'autre non. Mais peu importe, le soucis continue que je mette l'un ou l'autre.

    J'ai une classe BD_Access qui me retourne une connexion. Avec un systemoutprint(), je me rend compte que lors de l'appel de cette classe, le sysoutprint passe bel et bien une seule fois, donc je pense que je peux exclure le BD_Access de ce soucis.

    Voici un bout de mon controller :

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    public class ControllerAdmin extends Component implements ActionListener {
     
        private Vue_administrateur vue_admin;
        private Reservation vue_resa;
     
        public ControllerAdmin(Vue_administrateur vue_admin) {
            this.vue_admin = vue_admin;
        }
     
        public ControllerAdmin(Reservation vue_resa) {
            this.vue_resa = vue_resa;
        }
     
        /**
         * @param event administrateur controller
         *              différents events quand on avance de page en page lors de la création d'un film, d'une salle ou de l'affichage de la iste des users inscrits
         */
        public void actionPerformed(ActionEvent event) {
            Object source = event.getSource();
            // Controller pour la création d'une salle en XML
            if (source == vue_admin.ajout_salle) {
                String salle = vue_admin.salle.getText();
                Integer row = (Integer) vue_admin.row.getValue();
                Integer col = (Integer) vue_admin.col.getValue();
                Integer handi = (Integer) vue_admin.handi.getValue();
                Integer totalPlaces;
                // calcul nb total de places
                totalPlaces = row * col;
                try {
                    int i;
                    i = Integer.decode(salle);
                } catch (NumberFormatException e) {
     
                    JOptionPane.showMessageDialog(this, "Le numéro de salle doit être un chiffre compris entre 1 et 3", "Attention", JOptionPane.INFORMATION_MESSAGE);
                }
                // On caste le jtextfield en integer pour vérifier SI ce n'est pas compris entre 1 et 3, SINON on exécute le parse xml
                int salleInt = Integer.parseInt(salle);
     
                if (salleInt > 3) {
                    JOptionPane.showMessageDialog(this, "Il n'y a que 3 salles dans ce cinéma. Si vous voulez reconstruire une salle, choisissez 1, 2 ou 3 et nos architectes se mettront au boulot !", "Attention", JOptionPane.INFORMATION_MESSAGE);
                } else if (salleInt < 1) {
                    JOptionPane.showMessageDialog(this, "Il n'y a que 3 salles dans ce cinéma. Si vous voulez reconstruire une salle, choisissez 1, 2 ou 3 et nos architectes se mettront au boulot !", "Attention", JOptionPane.INFORMATION_MESSAGE);
                } else {
                    final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     
                    try {
                        DocumentBuilder builder = factory.newDocumentBuilder();
                        Document xml = builder.newDocument();
     
                        Element root = xml.createElement("salle");
                        Element trunk1 = xml.createElement("numSalle");
                        Element trunk2 = xml.createElement("nbCol");
                        Element trunk3 = xml.createElement("nbRow");
                        Element trunk4 = xml.createElement("nbHandi");
     
                        root.appendChild(trunk1);
                        root.appendChild(trunk2);
                        root.appendChild(trunk3);
                        root.appendChild(trunk4);
     
                        trunk1.setTextContent(salle);
                        trunk2.setTextContent(String.valueOf(col));
                        trunk3.setTextContent(String.valueOf(row));
                        trunk4.setTextContent(String.valueOf(handi));
     
                        // On crée un fichier xml correspondant au résultat
                        // construire la transformation inactive
                        Transformer t = TransformerFactory.newInstance().newTransformer();
                        t.setOutputProperty(OutputKeys.INDENT, "yes");
                        String resultFile = "salles/Salle " + salle + ".xml";
                        StreamResult XML = new StreamResult(resultFile);
     
                        t.transform(new DOMSource(root), XML);
                        System.out.println("Le fichier " + resultFile + ".xml a été créé.");
     
     
                        String salle_nom = "Salle " + salle;
                        String querySalle = "UPDATE salle SET nb_place = '" + totalPlaces + "' WHERE salle_nom = '" + salle_nom + "'";
                        String querySalleHandi = "UPDATE salle SET nb_place_handi = '" + handi + "' WHERE salle_nom = '" + salle_nom + "'";
                        try {
                            PreparedStatement state = BD_Access.getInstance().prepareStatement(querySalle);
    //                        java.sql.Statement state = BD_Access.getInstance().createStatement();
                            state.executeUpdate();
                            state.close();
     
                            PreparedStatement stateBis = BD_Access.getInstance().prepareStatement(querySalleHandi);
    //                        java.sql.Statement stateBis = BD_Access.getInstance().createStatement();
                            stateBis.executeUpdate();
                            stateBis.close();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
     
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                vue_admin.setEnd("Votre salle a bien été ajoutée.");
                vue_admin.endingCreate();
            }
            if (source == vue_admin.ajout_film) {
     
                String film = vue_admin.textFilm.getText();
     
                if (film == null || film.length() == 0) {
                    JOptionPane.showMessageDialog(null,
                            "Vous devez rentrer un titre de film", "Champs vide",
                            JOptionPane.ERROR_MESSAGE);
                } else {
                    String apiKey = "c5f1c364694d8b4dcee999aee55a";
                    film = (film.replace(' ', '+'));
                    System.out.println("film choisi : " + film);
                    String url = "https://api.themoviedb.org/3/search/movie?api_key=" + apiKey + "&language=fr&&region=FR&query=" + film;
     
                /* On rempli le json à l'aide d'input stream*/
                    InputStream input = null;
                    OutputStream output = null;
                    try {
                        input = new URL(url).openStream();
                        output = new FileOutputStream("salles/films.json");
                        byte[] buffer = new byte[1024];
                        for (int length; (length = input.read(buffer)) > 0; ) {
                            output.write(buffer, 0, length);
                        }
                        System.out.println("Fichier rempli : output.json");
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        if (output != null)
                            try {
                                output.close();
                            } catch (IOException logOrIgnore) {
                            }
                        if (input != null)
                            try {
                                input.close();
                            } catch (IOException logOrIgnore) {
                            }
                    }
                    try {
                        JSONParser parser = new JSONParser();
                        Object object = parser.parse("salles/films.json");
     
                        // convert Object to JSONObject
                        JSONObject jsonObject = (JSONObject) object;
     
                        // Reading the array
                        JSONArray results = (JSONArray) jsonObject.get("results");
     
                        // on affiche la nouvelle page
                        vue_admin.choseFilm(results);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }

    Ma vue, classique qui appelle son controller, composée de plusieurs fonctions qui fonctionne comme le AddSalle() et qui plante del a même manière.

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    public class Vue_administrateur extends JFrame implements ActionListener {
     
        /* ControllerLogin */
        private ControllerAdmin getcontrol = new ControllerAdmin(this);
     
        /**
         * Constructeur
         */
        public Vue_administrateur() {
     
    //        this.text.setEditable(false);
            setSize(800, 500);
            setTitle("Panneau d'administration - CinéGo");
            setLocationRelativeTo(null);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setVisible(true);
     
            initToolbar();
            initContent();
        }
     
        /**
         * @param event actionListener sur la banière en top
         *              A externaliser vers controller
         */
        public void actionPerformed(ActionEvent event) {
            Object source = event.getSource();
     
            if (source == fermer_fen) {
                this.fermer_fen();
            } else if (source == add_film) {
                /* ajout d'un film */
                System.out.println("Ajouter un film");
                addFilm();
                setEntete("Vous pouvez ici ajouter un film. Procédure: Choisir le titre du film que vous voulez programmer; lui ajouter un créneau et une salle.");
            } else if (source == add_salle) {
            /* Ajout d'une salle*/
                System.out.println("Ajouter une salle");
                addSalle();
                setEntete("Vous pouvez ici ajouter une salle. Procédure: Ajoutez son numéro, puis son nombre de place handicapées, de colonnes et de rangées");
            }
        }
     
        /**
         * ajouter une salle vers fichier .xml
         *
         */
        public void addSalle() {
            result.removeAll();
            result.repaint();
            result.setLayout(new GridBagLayout());
     
            GridBagConstraints c = new GridBagConstraints();
            c.insets = new Insets(0, 5, 5, 0);
     
            salle.setPreferredSize(new Dimension(40, 25));
            row.setPreferredSize(new Dimension(40, 25));
            col.setPreferredSize(new Dimension(40, 25));
            handi.setPreferredSize(new Dimension(40, 25));
     
            c.gridheight = 1;
            c.gridwidth = 1;
            c.gridx = c.gridy = 0;
            result.add(newSalle, c);
     
            // nom de la salle
            c.gridy = 1;
            result.add(salleLab, c);
            c.gridx = 1;
            result.add(salle, c);
     
            // colonnes
            c.gridx = 0;
            c.gridy = 2;
            result.add(colLab, c);
            c.gridx = 1;
            result.add(col, c);
     
            // rangées
            c.gridx = 0;
            c.gridy = 3;
            result.add(rowLab, c);
            c.gridx = 1;
            result.add(row, c);
     
            c.gridx = 0;
            c.gridy = 4;
            result.add(handiLab, c);
            c.gridx = 1;
            result.add(handi, c);
     
            // bouton
            c.gridx = 0;
            c.gridy = 5;
            c.fill = GridBagConstraints.REMAINDER;
            result.add(ajout_salle, c);
     
            ajout_salle.addActionListener(getcontrol);
     
            result.revalidate();
        }
    Voilà,

    J'ai essayé d'être au plus clair.

    En espérant que quelqu'un ait une idée pour me débloquer de ce facheux problème.

    Je dois passer à côté d'un truc simple dont je n'ai peut être pas connaissance.

    Merci à qui prendra le temps de lire ça !

    Ichoui

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Lors de la prise en compte de l'évenement de clic sur le bouton add_salle, par la méthode actionPerformed, ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    else if (source == add_salle) {
            /* Ajout d'une salle*/
                System.out.println("Ajouter une salle");
                addSalle();
                setEntete("Vous pouvez ici ajouter une salle. Procédure: Ajoutez son numéro, puis son nombre de place handicapées, de colonnes et de rangées");
            }
    on exécute la méthode addSalle(), qui là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ajout_salle.addActionListener(getcontrol);
    ajoute un écouteur d'action (donc de clic sur ce bouton ajout_salle).

    En résumé, à chaque fois que tu cliques sur le bouton tu ajoutes un écouteur qui invoque ton contrôleur. Tous les écouteurs enregistrés étant toujours invoqués, la première fois ça invoque le contrôleur une fois, la deuxième deux fois, la troisième trois fois, etc.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2018
    Messages : 3
    Par défaut
    Bonjour,

    Merci de ta réponse.

    Jusque là, je te suis.

    Il y a t-il une solution pour contourner ce problème donc ? Peut-être ne faut-il pas utiliser un actionListener à cet endroit / de cette manière?

    Dans mon cahier des charges, je dois être en mesure de pouvoir cliquer 3 fois sur ce bouton, tout en évitant cette duplication 1 / 2 / X ... fois.

    Merci,
    Ichoui

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2018
    Messages : 3
    Par défaut
    Rebonjour,

    Après 2 recherches, j'ai compris qu'il fallait rajouter un ajout_salle.removeActionListener(getcontrol); pour fermer la session de l'actionListener.

    Je te remercie de ton aide, ça m'a aidé dans ma réflexion.

    Je passe en résolu.

    Merci,
    Ichoui

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Ichoui Voir le message
    Il y a t-il une solution pour contourner ce problème donc ? Peut-être ne faut-il pas utiliser un actionListener à cet endroit / de cette manière?
    C'est l'évidence même. On enregistre les écouteurs d’événements lorsque c'est nécessaire. En général, dans la plupart des cas, on le fait au moment où le bouton est créé.

    Citation Envoyé par Ichoui Voir le message
    Après 2 recherches, j'ai compris qu'il fallait rajouter un ajout_salle.removeActionListener(getcontrol); pour fermer la session de l'actionListener.
    Oui, m'enfin, le programme peut passer son temps à ajouter et à retirer le même écouteur, mais autant le faire qu'une fois au tout début. A moins que getcontrol change à chaque fois. Mais même dans ce cas, il est préférable de faire ça quand ça change et pas ailleurs.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Comment tracker (Voir) la requête sql qui envoyée vers la base
    Par devalender dans le forum MkFramework
    Réponses: 2
    Dernier message: 04/11/2014, 22h47
  2. Requête SQL qui pose problème
    Par berko dans le forum Langage SQL
    Réponses: 11
    Dernier message: 29/11/2013, 14h02
  3. Requête SQL qui me pose problème
    Par CB56 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/02/2007, 16h07
  4. Réponses: 2
    Dernier message: 06/06/2005, 15h13
  5. Requête SQL qui me bloque
    Par David Guillouet dans le forum Langage SQL
    Réponses: 5
    Dernier message: 27/04/2004, 14h52

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