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 :

Insertion Dans 2 tables Sql.


Sujet :

JDBC Java

  1. #1
    Futur Membre du Club Avatar de ComorienKM
    Homme Profil pro
    Amateur
    Inscrit en
    Août 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Août 2017
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Insertion Dans 2 tables Sql.
    Re bonour Tout le Monde. Enfait j'ai 2 tables , je veux inserer avec 2 requetes comme le montre le code cidessous:
    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
     
       // ENREGISTREMMENT
            String nom = txtnm.getText();
            String prnm = txtpr.getText();
            String sexe = txtda.getText();
            String adr = txtad.getText();
            String tel = txttel.getText();
            String mdp = txtmdp.getText();
            Object stat = txtstat.getSelectedItem();
            Object fonc = txtfnct.getSelectedItem();
     
            String req1 = "INSERT INTO profil (idFonction,idStatut) select idFonction,idStatut from fonction,statut Where nomFonction='" + fonc + "' And nomStatut='" + stat + "' ";
            String req = "INSERT INTO PROFIL(nom,prenom,sexe,adresse,tel,password) VALUES ('" + nom + "','" + prnm + "','" + sexe + "','" + adr + "','" + tel + "','" + mdp + "')";
     
            try {
                stmt.executeUpdate(req);
                stmt.executeUpdate(req1);
     
                JOptionPane.showMessageDialog(null, "Insertion Reussie");
     
            } catch (SQLException e) {
                JOptionPane.showMessageDialog(null, "Erreur d'enregistrement\n" + e.getLocalizedMessage());
     
            }
    Mais a chaque fois que j'execute il y'a erreur, "Field Nom doesn't Have a default Value", bien sur ça dit que Nom n'a pas de valeure par defaut mais je comprend pas le rapport! ! Eclairez moi svp...Cordialemment

  2. #2
    Membre régulier Avatar de Tchicken
    Homme Profil pro
    Responsable d'exploitation informatique
    Inscrit en
    Août 2017
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Responsable d'exploitation informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 108
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    je pense que ce message viens de ta base de données, il est possible que ce champs nécessite une valeur obligatoire et différente de nulle.

  3. #3
    Futur Membre du Club Avatar de ComorienKM
    Homme Profil pro
    Amateur
    Inscrit en
    Août 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Août 2017
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Tchicken Voir le message
    Bonjour,

    je pense que ce message viens de ta base de données, il est possible que ce champs nécessite une valeur obligatoire et différente de nulle.
    Bien sur que ça vien de ma base donnée!!Pourquoi neccesseiterait 'il une valeur obligatoire?

  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
    Salut,

    Déjà, ton catch ne permet pas de savoir sur quelle requête l'erreur se passe : ce serait mieux de faire 2 catchs, un pour chaque executeUpdate.

    Le problème est probablement la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String req1 = "INSERT INTO profil (idFonction,idStatut) select idFonction,idStatut from fonction,statut Where nomFonction='" + fonc + "' And nomStatut='" + stat + "' ";
    Elle insert dans profil dans (au moins) un nouvel enregistrement 2 champs. Or il y'a d'autres champs : le nom, le prénom, etc. Et probablement ta table dans la base est configuré pour que le nom soit obligatoire et sans valeur par défaut.

    Mais insérer 2 enregistrements n'est probablement ce que tu veux faire, mais insérer l'ensemble des valeurs dans un unique enregistrement.

    En plus, je ne suis pas sûr que la requête req1 fonctionne comme tu l'attends : ça fait un bout de temps que je n'ai pas fait de SQL, donc j'ai un petit doute à ce sujet, il faudrait tester, mais je pense que le "and" va faire que tu auras 2 enrgistrements en réponse, parce qu'il n'y a aucune jointure entre les tables fonction et statut, donc tu auras probablement un produit cartésien des résultats des 2 requêtes. Ou aucun enregistrement peut-être sur certains SGBD.

    Toujours est-il que soit tu dois insérer toutes les valeurs en un insert. Soit récupérer l'id créé par l'insert fait par req. Puis s'en servir dans la clause where du second insert. Tu peux récupérer l'id par la méthode getGeneratedKeys() de Statement.
    Pour faire le truc en une seule requête, je pense qu'il faudrait écrire en SQL :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into profil select "nom", "prenom", ..., (select idfonction from fonction where nomfonction="xxx"), (select idstatut from statut where nomstatut=...)... from dual
    (le from dual ne fonctionne peut être pas sur tout les SGBD...pour certains, il n'y a même pas besoin de "from dual".)

    Une autre solution serait de récupérer les id en Java au moment où tu récupères les noms, les stocker dans une petite classe(2 attributs: l'id et le nom), et l'utiliser dans la combo directement au lieu du nom.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Valeur {
       public final int id; // ou String id si les id sont de type varchar
       public final String nom;
       public Valeur(int id, String nom) {
             this.id=id;
             this.nom=nom;
       }
     
       // cette méthode permet de simplifier l'affichage dans la JComboBox (afficher le nom comme tu veux)
       public String toString() {
             return nom; 
       }
    }
    Récupération de la liste de fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Try(Statement statement = connection.createStatement();
    ResultSet resultset = statement.executeQuery("select idFonction, nomFonction from fonction");) {
       List<Valeur> fonctions = new ArrayList<>();
       while( resultset.next()) {
          fonctions.add(new Valeur( resultset.getInt(1), resultset.getString(2) ) );
       }
    }
    catch(SQLException e) {
       // traitement exception...
       e.printStackTrace();
    }
    Création combo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JComboBox<Valeur> comboFonctions = new JComboBox<>(new Vector<Valeur>(fonctions));
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JComboBox<Valeur> comboFonctions = new JComboBox<>(fonctions.toArray(new Valeur[fonctions.size()]));
    Ensuite pour récupérer par exemple une valeur dans la combo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Valeur valeur = (Valeur)comboFonctions.getSelectedItem();
    int id = valeur.id;
    String nomFonction=valeur.nom;
    Avce ça tu pourras directement insérer les ids de fonction et statut avec le reste dans le INSERT.

    Accessoirement, si tu veux pouvoir récupérer un nom par son id, et que les noms sont bien distinct, tu peux utiliser une map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<String, Integer> mapFonctions = fonctions.stream().collect(Collectors.toMap(v->v.nom, v->v.id));
    Et pour avoir l'id correspond au nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int id = mapFonctions.get(nom);
    Enfin, les Statement présentent quelques défauts et il est préférables d'utiliser les PreparedStatement à la place. Déjà ça évitera les possibilités d'injection SQL, et surtout ça t'évitera les soucis que peuvent poser les formats spéciaux (date par exemple) et surtout la gestion des quotes, et en particulier l'échappement des quotes dans la valeur (essaye avec ton programme de mettre en nom O'Rourke par exemple et tu verras ce qu'il se passe).
    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
    Futur Membre du Club Avatar de ComorienKM
    Homme Profil pro
    Amateur
    Inscrit en
    Août 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Août 2017
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Je vais de ce pas testez les codes...et je vous informe des nouveautés!! Merci Beaucoup La team

  6. #6
    Futur Membre du Club Avatar de ComorienKM
    Homme Profil pro
    Amateur
    Inscrit en
    Août 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Août 2017
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Pour faire le truc en une seule requête, je pense qu'il faudrait écrire en SQL :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into profil select "nom", "prenom", ..., (select idfonction from fonction where nomfonction="xxx"), (select idstatut from statut where nomstatut=...)... from dual
    (le from dual ne fonctionne peut être pas sur tout les SGBD...pour certains, il n'y a même pas besoin de "from dual".)
    En suivant Votre Methode Joel, G essayer de tout mettre sur une seule requete! mais je pense que ma syntaxe n'est pas bonne !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO PROFIL select idFonction,idStatut,nom,prenom,sexe,adresse,tel,password (select idFonction from fonction where nomFonction='" + fonc +"'),(select idStatut from statut where nomStatut='" + stat +"'),('" + nom + "','" + prnm + "','" + sexe + "','" + adr + "','" + tel + "','" + mdp + "');

    Desole du retard aussi!! Mais j'aurais vraiment besoin d'une aide au plus vite...!!
    ++++Cordialement

  7. #7
    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
    1. il manque une virgule entre password et le champ suivant (un select)
    2. le select suivant le into, ayant des champs listés devrait avoir un from, sinon comment le moteur SQL saurait où récupérer ces champs
      Ou alors il s'agit de constantes, et elles devraient être quotées. En tout cas, tu ne peux pas mettre directement des noms de variables dans une requête SQL.
      Dans l'exemple que j'ai indiqué, j'ai écrit quelque chose comme ça : INSERT INTO ... quelque chose. Le "quelque chose" est un SELECT. Comme les informations à insérer ne sont pas des valeurs connues de la base, on ne pas utiliser un SELECT ... FROM une table. On peut faire un SELECT avec des constantes au lieu de champ, mais selon le SGBD, il faudra indiquer un from ou pas, d'où le from dual de mon exemple. Avec MySQL par exemple, tu peux te passer du from : écrire SELECT 1, 'machin' fonctionne. MySQL accepte aussi la syntaxe "from dual".
    3. j'ai mis dans mon "exemple" des doubles-quotes parce que c'était un exemple de principe. Il faut quoter avec le symbole adéquat, ou, mieux, utiliser un PreparedStatement pour éviter d'avoir à le gérer.
    4. les syntaxes
      • insert into values (...,...,...)
      • insert into select ...,...,... from ...

      sont exclusives. Tu ne peux pas les utiliser en même temps. Le "('" + nom + "','" + prnm + "','" + sexe + "','" + adr + "','" + tel + "','" + mdp + "')" à la fin de ta requête ne devrait pas y figurer : c'est justement la partie après "into ... select" qui remplace ça. Parce qu'on ne peut pas mettre de select dans la partie "values" du insert into.
    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.

  8. #8
    Futur Membre du Club Avatar de ComorienKM
    Homme Profil pro
    Amateur
    Inscrit en
    Août 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Août 2017
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Trouvaille d'une requete qui fonctionne
    Voila, j'ai fait de mon mieux parceque j'ai trouvé une autre syntaxe qui fonctionne,( a peu pré), voil à le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into profil set idFonction =(select idFonction from fonction where nomFonction='" + fonc +"'),idStatut=(select idStatut from statut where nomStatut='" + stat +"'),nom='"+nom+"',prenom='"+prnm+"',sexe='"+sexe+"',adresse='"+adr+"',password='"+mdp+"',tel='"+tel+"';
    Mais le probleme mtn c que ça insert double!c a d que l'enregistrement se fait 2 fois lors de l'execution de la requete....Je ne sais pas pourquoi!Qu'elqu'un à une idée?
    +++ MERCI

  9. #9
    Futur Membre du Club Avatar de ComorienKM
    Homme Profil pro
    Amateur
    Inscrit en
    Août 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Août 2017
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Resolution
    Merci a toute l'equipe!!!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/11/2007, 17h43
  2. [SQL] Insertion dans plusieurs tables
    Par fadex dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 15/02/2007, 11h47
  3. [SQL] Récupération de données et Insert dans une table
    Par heteroclite dans le forum PHP & Base de données
    Réponses: 32
    Dernier message: 12/07/2006, 16h17
  4. Réponses: 7
    Dernier message: 27/01/2006, 15h57
  5. insertion dans une table en pl/sql
    Par jejam dans le forum PL/SQL
    Réponses: 9
    Dernier message: 24/08/2005, 18h06

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