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
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 :
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.
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:
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
JComboBox<Valeur> comboFonctions = new JComboBox<>(new Vector<Valeur>(fonctions));
ou
JComboBox<Valeur> comboFonctions = new JComboBox<>(fonctions.toArray(new Valeur[fonctions.size()]));
Ensuite pour récupérer par exemple une valeur dans la combo :
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 :
Map<String, Integer> mapFonctions = fonctions.stream().collect(Collectors.toMap(v->v.nom, v->v.id));
Et pour avoir l'id correspond au nom :
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).
Partager