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 :

valeur null dans un champ not null


Sujet :

JDBC Java

  1. #1
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut valeur null dans un champ not null
    j'ai un problème dans le code que je trouve pas car une exception se génère disant que la colonne 'TITRE' ne peut pas accepter la valeur NULL mais je saisie des données dans le champ titre.

    la classe livre contient juste des getters et setters

    classe du frame:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void btnNewActionPerformed(java.awt.event.ActionEvent evt) {                      
           livre unLivre = new livre();       
    livres control = new livres();
                             //passer les données au modèle
            unLivre.setTitre(txtTitre.getText());
            unLivre.setIsbn(txtIsbn.getText());
            unLivre.setIsbn(txtCouverture.getText());
            //appeler le controleur de création
            control.creerLivre();
            tab.Update_table("livre",tableLivres);
     
        }
    la classe livres contenant la méthode:
    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
    public void creerLivre() {        String query = "INSERT INTO livre (titre,isbn,couverture) VALUES(?,?,?)";
            try {
                stat = cnx.prepareStatement(query);
                stat.setString(1, unLivre.getTitre());
                stat.setString(2, unLivre.getIsbn());
                stat.setString(3, unLivre.getCouverture());
                stat.execute();
     
            } catch (Exception create) {
                create.printStackTrace();
            } finally {
                try { if (rslt != null) { rslt.close(); }} catch (Exception e) {};
                try { if (stat != null) { stat.close(); }} catch (Exception e) {};
            }
        }

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il y a de nombreux problèmes dans ton code. Premièrement, il est incomplet, mais on devine un gros problème :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    livre unLivre = new livre();       
    livres control = new livres();
    //passer les données au modèle
    /*...*/
    //appeler le controleur de création
    control.creerLivre();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void creerLivre() {        
    /*...*/
                stat.setString(1, unLivre.getTitre());
    La variable unLivre du premier extrait de code est locale à la méthode btnNewActionPerformed. Il est impossible que la variable unLivre utilisée dans la méthode creerLivre soit la même, quelque soit le code que tu ne nous montres pas, car il ne peut s'agir que d'un attribut de la classe livres. Deux variables donc qui n'ont aucun rapport (même si elles ont le même nom, et peut-être le même type). Si la variable unLivres de la classe livres n'est pas initialisée (ni dans sa déclaration, ni dans le constructeur de la classe livres, elle aura donc la valeur null. Et comme il n'y aucun passage de paramètre, la variable ne peut que rester null. D'où NullPointerException. Vu que tu n'en obtiens pas, j'imagine que ta variable est bien initialisé par un new livre(). Comme tu n'a pas, heureusement, été jusqu'à déclarer les attributs de la classe livre en static, ces attributs ne sont donc probablement pas initialisés, d'ou le problème avec la colonne TITRE.

    Ce genre d'erreur est due essentiellement à de mauvaises pratiques quant à la portée des variables, et au non usage de paramètre en corrélation avec ces mauvaises pratiques. Les variables doivent toujours être déclarées et initialisées au "plus près" de leur usage. Si l'usage est local, leur portée doit être locale. Et utilise des paramètres, pour transmettre les objets entre méthodes.

    Mauvais :
    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
    public class Mauvais {
     
        private int truc;
     
        public void faireMachin(int valeur) {
                  truc = valeur;
                  fonction(); 
                  afficher();
        }
     
        protected void afficher() {
                 System.out.println(truc);
        }
     
        protected int fonction() {
                /** du code qui modifie truc **/
        }
     
    }
    Bon:
    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
    public class Bon {
     
        public void faireMachin(int valeur) {
                  int truc = fonction(valeur);  // variable locale
                  afficher(truc); // passage de paramètre
        }
     
        protected void afficher(int machinAAfficher) { 
                 System.out.println(machinAAfficher);
        }
     
        protected int fonction(int param) {
                /** du code qui fait un calcul sur param et retourne le résultat **/
        }
     
    }
    C'est également vrai avec ton PreparedStatement. Il n'y a aucune raison qu'il soit déclaré en variable de classe ! Par ailleurs, tu peux nettement simplifier la méthode :

    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
    public class Livres {
     
    private static final String QUERY_CREER = "INSERT INTO livre (titre,isbn,couverture) VALUES(?,?,?)";
     
    /**...**/
     
    public void creerLivre(Livre unLivre) {
            try (PreparedStatement stat = cnx.prepareStatement(QUERY_CREER) ) { 
                stat.setString(1, unLivre.getTitre());
                stat.setString(2, unLivre.getIsbn());
                stat.setString(3, unLivre.getCouverture());
                stat.executeUpdate();
            } catch (SQLException create) {
                create.printStackTrace();
            } 
        }
    La structure try-with-resource va fermer d'elle-même le Statement à la fin du bloc (au passage, pour un select, fermer le Statement suffit à fermer le ResulSet courant). Et ça, c'est un minimum. Parce que la connexion sous forme de variable de classe pose un problème : comment est-elle fermée, ou rendue au pool le cas échéant ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void creerLivre(Livre unLivre) {
            final Connection cnx = obtenirUneConnection(); // une méthode qui obtient une connection (en la créant en direct, en la demandant à un pool, etc.)
            try (PreparedStatement stat = cnx.prepareStatement(QUERY_CREER) ) {
                stat.setString(1, unLivre.getTitre());
                stat.setString(2, unLivre.getIsbn());
                stat.setString(3, unLivre.getCouverture());
                stat.execute();
            } catch (SQLException create) {
                create.printStackTrace();
            } finally {
               relacher( cnx ); // on rend la connexion au pool le cas échéant, ou on la ferme
            } 
     
        }
    Ensuite, l'exception devrait être remontée, ou au moins un état qui dit que ça c'est mal passé devrait être remonté, par exemple sous forme de booléen.

    Au passage, les conventions en Java, c'est les noms des classes commencent pas une majuscule. Donc Livre, pas livre, et Livres, pas livres (quoique cette classe devrait avoir un nom plus explicite, genre BookDao par exemple).

    Enfin, je pense qu'il y a un problème dans cet extrait, dans la dernière ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unLivre.setTitre(txtTitre.getText());
    unLivre.setIsbn(txtIsbn.getText());
    unLivre.setIsbn(txtCouverture.getText());
    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
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    j'ai compris l'erreur pour le null, je l'ai rectifié et il a passé ce bout de code, mais il a affiché une erreur concernant le dernier champs comme vous l'avez prévu, je ne comprends pas pourquoi !!
    voilà l'erreur:
    java.sql.SQLDataException: Une erreur de troncature a été détectée lors de la tentative de réduction de VARCHAR 'C:\Users\Hind\Pictures\2.png' à une longueur de 20.
    alors que mon champs est varchar(100), ce champs contient juste un path de l'image de ouverture du livre

  4. #4
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Bah, tu ne vois pas que tu mets le contenu du champ txtCouverture dans la propriété isbn ?

    unLivre.setIsbn(txtCouverture.getText());
    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.

  5. #5
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    je pense que c'est à cause des lunettes puisque je viens de les mettre merci beaucoup joel, j'apprends toujours des choses de votre part

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

Discussions similaires

  1. Saisir une valeur null dans 1 champ de ma table
    Par User dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/03/2007, 23h40
  2. [TStringField] inserer dans un champs NOT NULL une chaine vi
    Par kase74 dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/09/2005, 14h48
  3. Réponses: 3
    Dernier message: 10/08/2005, 11h11
  4. Inserer une valeur NULL dans un champ datetime
    Par Karibou dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/08/2005, 10h58
  5. Mettre null dans un champ avec un domaine de valeur
    Par Kantizbak dans le forum SQL
    Réponses: 7
    Dernier message: 16/02/2005, 09h24

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