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

JDBC Java Discussion :

Vérifier si un champ existe dans une BDD.


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 15
    Points : 15
    Points
    15
    Par défaut Vérifier si un champ existe dans une BDD.
    Bonjour à tous,

    J'aurai besoin d'aide sur ma vérification d'un champ dans une table de ma BDD. Je m'explique :

    Je suis en train de réaliser une application, l'utilisateur peut enregistrer une section(idSection, idRole, idChambre). idSection est la clé primaire. Ce que je souhaite faire, c'est récupérer la valeur de idSection, et s'il elle existe déjà dans ma BDD, lui renvoyer une erreur. J'ai essayé avec un IF EXIST, mais je n'ai pas trop compris la syntaxe et ça n'a pas fonctionné. Le code me génère une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     java.sql.SQLIntegrityConstraintViolationException: Duplicata du champ '0001' pour la clef 'PRIMARY'
    "0001" est la valeur que j'ai rentré dans le formulaire. Je voulais donc savoir si c'était possible de récupérer le java.sql.SQLIntegrityConstraintViolationException et faire en sorte de dire que SI cette exception est générée, dans ce cas lui renvoyer l'erreur ?

    Voici ma fonction enregistrerSection :

    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
         public static void enregistrerSection(ActionEvent event, int idSection, int idRole, int idChambre) throws SQLException {
            Connection connection = null;
            PreparedStatement preparedStatement1 = null;
            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
     
     
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/le_pigeonnier", "root", "root");
            preparedStatement1 = connection.prepareStatement("SELECT COUNT(*) FROM section WHERE idSection = ?");
            preparedStatement = connection.prepareStatement("INSERT INTO section(idSection, idRole, idChambre) VALUES (?,?,?)");
     
     
            preparedStatement1.setInt(1, idSection);
     
            preparedStatement.setInt(1, idSection);
            preparedStatement.setInt(2, idRole);
            preparedStatement.setInt(3, idChambre);
     
     
     
            resultSet = preparedStatement1.executeQuery();
            int resultQuery = preparedStatement.executeUpdate();
     
            if(resultSet != null){
                if(resultQuery !=0){
                    System.out.print("Section ajouté.");
                    Alert alert = new Alert(Alert.AlertType.INFORMATION);
                    alert.setTitle("Insertion confirmée");
                    alert.setHeaderText("Confirmation");
                    alert.setContentText("La section a bien été enregistré.");
                    alert.show();
                    changeScene(event, "/fxml/section/section_personnel.fxml", "Gestion des sections personnel", "");
                } else{
                    System.out.print("Section non ajoutée");
                    Alert alert = new Alert(Alert.AlertType.ERROR);
                    alert.setTitle("Erreur d'insertion");
                    alert.setHeaderText("Erreur");
                    alert.setContentText("Une erreur est survenue lors de l'insertion, veuillez réessayer.");
                    alert.show();
                    changeScene(event, "/fxml/section/enregistrer_section.fxml", "Gestion des sections personnel", "");
                }
            } else{
                Alert alert = new Alert(Alert.AlertType.ERROR);
                alert.setTitle("Insertion échouée");
                alert.setHeaderText("Erreur");
                alert.setContentText("La section que vous avez essayé d'enregistrer existe déjà : " + idSection);
                alert.show();
                changeScene(event, "/fxml/section/section_personnel.fxml", "Gestion des sections personnel", "");
            }
     
        }
    Voici mon section.fxml :

    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
     <?xml version="1.0" encoding="UTF-8"?>
     
    <?import javafx.scene.text.*?>
    <?import java.lang.*?>
    <?import java.util.*?>
    <?import javafx.scene.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
     
     
    <AnchorPane prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: #032445;" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="eu.hautil.pigeonnier.section.SectionPersonnelController">
       <children>
          <Text fill="WHITE" layoutX="223.0" layoutY="32.0" strokeType="OUTSIDE" strokeWidth="0.0" text="McPigeon" underline="true" wrappingWidth="189.06884765625">
             <font>
                <Font name="Arial" size="35.0" />
             </font>
          </Text>
          <Text fill="WHITE" layoutX="201.0" layoutY="70.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Section Personnel">
             <font>
                <Font name="Arial Bold" size="25.0" />
             </font>
          </Text>
          <Button fx:id="MS_button" layoutX="150.0" layoutY="186.0" mnemonicParsing="false" prefHeight="50.0" prefWidth="300.0" style="-fx-background-radius: 15; -fx-background-color: #FF8F1F;" text="Modifier une section" textFill="WHITE" underline="true">
             <font>
                <Font name="Arial Bold" size="20.0" />
             </font>
          </Button>
          <Button fx:id="ES_button" layoutX="150.0" layoutY="111.0" mnemonicParsing="false" prefHeight="50.0" prefWidth="300.0" style="-fx-background-radius: 15; -fx-background-color: #139905;" text="Enregistrer une section" textFill="WHITE" underline="true">
             <font>
                <Font name="Arial Bold" size="20.0" />
             </font>
          </Button>
          <Button fx:id="SS_button" layoutX="150.0" layoutY="259.0" mnemonicParsing="false" prefHeight="50.0" prefWidth="300.0" style="-fx-background-radius: 15; -fx-background-color: #FF0000;" text="Supprimer une section" textFill="WHITE" underline="true">
             <font>
                <Font name="Arial Bold" size="20.0" />
             </font>
          </Button>
          <Button fx:id="PS_button" layoutX="150.0" layoutY="330.0" mnemonicParsing="false" prefHeight="50.0" prefWidth="300.0" style="-fx-background-radius: 15; -fx-background-color: #575C53;" text="Parcourir une section" textFill="WHITE" underline="true">
             <font>
                <Font name="Arial Bold" size="20.0" />
             </font>
          </Button>
          <Button fx:id="back_button" layoutX="14.0" layoutY="349.0" mnemonicParsing="false" style="-fx-background-color: #4A0101; -fx-background-radius: 15;" text="Retour" textFill="WHITE" underline="true">
             <font>
                <Font name="Arial Bold" size="20.0" />
             </font>
          </Button>
       </children>
    </AnchorPane>
    Vous pouvez voir ci-dessus que j'ai essayé avec un SELECT COUNT(*), mais l'exception prend le dessus.

    Merci d'avance pour vos réponses !

  2. #2
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 329
    Points : 443
    Points
    443
    Par défaut
    Bonjour,

    Il y à deux erreurs dans votre code.

    Premièrement, vous effectuez l'insert sans vérifier le résultat de l'existence de la ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // Ceci est votre code:
    resultSet = preparedStatement1.executeQuery(); // <- Execute la requête mais ne vérifie pas le résultat
    int resultQuery = preparedStatement.executeUpdate(); // <- Execute l'insert
    Ensuite, plus bas, vous ne vérifiez pas le résultat de votre test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // Cecci est votre code:
    if(resultSet != null){ // Il ne sera pas null et il n'y aura pas d'erreur. Le réusltat du count sera >= 0
                if(resultQuery !=0){ // Ceci est le résultat de votre insert

    Essayez peut-être de nommer vos variables sur base de ce qu'elles représentent, pas ce qu'elles sont. Ca clarifieras le code (et les problèmes). Vous pouvez aussi introduire deux méthodes distinctes pour plus de clareté. Enfin, il me semble qu'il n'est pas nécessaire de compter, vous pouvez simplement retourner "1" si la ligne existe: SELECT 1 FROM section WHERE idSection=?

    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
     
    // Avec 'Connection' dans le scope de la classe:
    private boolean sectionIdIsAvailable(int idSection) {
      statement = connection.prepareStatement("SELECT 1 FROM section WHERE idSection = ?");
      statement.setInt(1, idSection);
      result = statement.executeQuery();
      return result.next();
    }
     
    private boolean insertSection(int idSection, int idRole, int idChambre) {
      statement = connection.prepareStatement("INSERT INTO section(idSection, idRole, idChambre) VALUES (?,?,?)");
      statement.setInt(1, idSection);
      statement.setInt(2, idRole);
      statement.setInt(3, idChambre);
      return statement.executeUpdate()!=0;
    }
     
    // Ailleurs
    if ( sectionIdIsAvailable(idSection) ) {
      insertSection(idSection, idRole, idChambre)
    } else ...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 15
    Points : 15
    Points
    15
    Par défaut
    Bonjour !

    Merci de votre réponse. Alors j'ai fais ce que vous m'avez expliqué, j'ai créé deux méthodes différentes dans mon DBUtils.java

    DBUtils.java (Là où toutes mes fonctions sont regroupées) :

    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
    public static boolean sectionIdIsAvailable(ActionEvent event, int idSection) throws SQLException {
            Connection connection = null;
            ResultSet resultVerifyIdLogin = null;
            PreparedStatement verifyIdLogin = null;
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/le_pigeonnier", "root", "root");
     
            verifyIdLogin = connection.prepareStatement("SELECT 1 FROM section WHERE idSection = ?");
            verifyIdLogin.setInt(1, idSection);
            resultVerifyIdLogin = verifyIdLogin.executeQuery();
            return resultVerifyIdLogin.next();
        }
     
        public static boolean insertSection(ActionEvent event, int idSection, int idRole, int idChambre) throws SQLException {
            Connection connection = null;
            PreparedStatement verifyInsert = null;
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/le_pigeonnier", "root", "root");
     
            verifyInsert = connection.prepareStatement("INSERT INTO section(idSection, idRole, idChambre) VALUES (?,?,?)");
            verifyInsert.setInt(1, idSection);
            verifyInsert.setInt(2, idRole);
            verifyInsert.setInt(3, idChambre);
            return verifyInsert.executeUpdate() != 0;
        }
    Alors j'ai deux questions :
    - A quoi sert le return resultSetCount.next();
    - A quoi sert et que veux dire le return verifyInsert.executeUpdate() != 0;

    De plus, j'ai mis mon if/else dans mon EnregistrerSectionController.java. Cependant, quand j'essaye d'enregistrer une section, ça me renvoie l'alerte erreur situé dans le else.

    EnregistrerSectionController.java :
    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
            submitButton.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    boolean isMyComboBoxEmpty = roleComboBox.getSelectionModel().isEmpty();
     
                    if (isMyComboBoxEmpty == true || tfIdSection.getText().isEmpty() || tfChambre.getText().isEmpty()) {
                        System.out.print("Champs manquant dans le formulaire.");
                        Alert alert = new Alert(Alert.AlertType.ERROR);
                        alert.setContentText("Un des champs est vide, veuillez réessayer.");
                        alert.show();
                        DBUtils.changeScene(event, "/fxml/section/enregistrer_section.fxml", "Enregistrer une section | McPigeon ", "");
     
                    }
                    else {
                        try {
                            if (DBUtils.sectionIdIsAvailable(DBUtils.stringToInt(tfIdSection.getText())) == true){
                                try {
                                    DBUtils.insertSection(DBUtils.stringToInt(tfIdSection.getText()), roleComboBox.getValue(), DBUtils.stringToInt(tfChambre.getText()));
                                    Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
                                    alert.setTitle("Insertion confirmée");
                                    alert.setHeaderText("Confirmation");
                                    alert.setContentText("L'insertion a bien été effectuée.");
                                    alert.show();
                                    DBUtils.changeScene(event, "/fxml/section/section_personnel", "Gestion section | McPigeon", "");
                                } catch (SQLException e) {
                                    e.printStackTrace();
                                }
                            } else {
                                Alert alert = new Alert(Alert.AlertType.ERROR);
                                alert.setTitle("Insertion échouée");
                                alert.setHeaderText("Erreur");
                                alert.setContentText("L'insertion a échouée.");
                                alert.show();
                                DBUtils.changeScene(event, "/fxml/section/enregistrer_section.fxml", "Gestion section | McPigeon", "");
     
                            }
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }
                    }
            });

    Merci de votre aide

    EDIT : J'ai réussi ! J'ai changé dans le if(... == "true" par "false"), je m'étais trompé dans la valeur du booléen, merci beaucoup !

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 845
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 845
    Points : 22 850
    Points
    22 850
    Billets dans le blog
    51
    Par défaut
    Note : je vois bien qu'il y a une interface FX et tout mais c'est un problème de JDBC donc qui n'a en fait aucun rapport avec JavaFX. Je déplace.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 329
    Points : 443
    Points
    443
    Par défaut
    Citation Envoyé par GeRvaxx- Voir le message
    - A quoi sert le return resultSetCount.next();
    Un "nouveau" ResultSet est positionné avant la première ligne (-1) et next() retourne true si il y à une ligne suivante. Dans votre cas, si il n'y à pas de résultat, la méthode va retourner false. Il y à longtemps que j'ai joué avec Jdbc mais il me semble que c'est ce comportement.
    - https://docs.oracle.com/javase/7/doc...et.html#next()

    Citation Envoyé par GeRvaxx- Voir le message
    - A quoi sert et que veux dire le return verifyInsert.executeUpdate() != 0;
    Statement.executeUpdate() va retourner le nombre de ligne qui ont été modifiées. Ce test (qui est tiré de votre code), va vérifier qu'il y à bien eu au moins une modification/insertion.
    - https://docs.oracle.com/javase/8/doc...a.lang.String-



    N'hésitez pas à marquer cette conversation comme résolu si vous pensez que c'est le cas.

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

Discussions similaires

  1. [AC-2003] Vérifier qu'un champ existe dans une table
    Par C15nantes dans le forum VBA Access
    Réponses: 4
    Dernier message: 27/11/2016, 11h49
  2. [AC-2007] Savoir si un champ existe dans une table
    Par Guns Of The Patriots dans le forum VBA Access
    Réponses: 5
    Dernier message: 08/03/2010, 10h30
  3. Réponses: 23
    Dernier message: 11/11/2007, 20h01
  4. [MySQL] Pb d'insertion d'une valeur de champ select dans une Bdd
    Par Mimisator dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 20/10/2005, 18h51

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