Operation not allowed after ResultSet closed

j'ai deux méthodes d'insertion dans une bdd qui génère l'exception "Oparation not allowed after ResultSet closed" que voici, alors qu'on a besoin de mettre stat.close():


@SuppressWarnings("deprecation")
public void insertEtudiant() throws Exception{
try{
int codeLieu = getLieu();
int codeNat = getNat();
String codeF = getFiliere();
int codeMotif = getMotif();

String query = "INSERT INTO etudiant (bac,nom,prenom,genre,adresse,n_phone,mail,n_ccp,decision,bloque,"
+ "n_ins,annee__encours,annee_univ,annee_courante,reste,"
+ "an_1,an_2,an_3,an_4,an_5,an_6,an_7,an_8,an_9,an_10,"
+ "cycle,nbr_annee,code_f,date_nais,code,code_nat,Observation,date_bloc,code_motif) "
+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

stat = cnx.prepareStatement(query);
stat.setString(1, txtBAC.getText());
stat.setString(2, txtNom.getText());
stat.setString(3, txtPrenom.getText());
stat.setString(4, genre);
stat.setString(5, txtAdr.getText());
stat.setString(6, txtPhone.getText());
stat.setString(7, txtMail.getText());
stat.setString(8, (String)txtCCP.getValue());
stat.setString(9, txtDec.getText());
stat.setBoolean(10, bloc);
stat.setString(11, txtIns.getText());
stat.setString(12, txtAn.getText());
stat.setString(13, txtUniv.getText());
stat.setInt(14,new java.sql.Date(System.currentTimeMillis()).getYear());
stat.setInt(15, reste);
//stat.setInt(6, rds);
stat.setInt(16, 0);
stat.setInt(17, 0);
stat.setInt(18, 0);
stat.setInt(19, 0);
stat.setInt(20, 0);
stat.setInt(21, 0);
stat.setInt(22, 0);
stat.setInt(23, 0);
stat.setInt(24, 0);
stat.setInt(25, 0);
stat.setString(26,txtBAC.getText());
stat.setString(27, codeF);
stat.setString(28, cycle);
stat.setString(29, ((JTextField) dateChooser.getDateEditor().getUiComponent()).getText());
stat.setInt(30, codeLieu);
stat.setInt(31, codeNat);
//stat.setInt(14, codePhoto);
stat.setString(32, txtObs.getText());
stat.setDate(33,new java.sql.Date(System.currentTimeMillis()));
stat.setInt(34, codeMotif);

stat.execute();

}catch(SQLException ex){
JOptionPane.showMessageDialog(null,"Problème insertEtudiant");
}
finally{
stat.close();
}
}

public void insertFils() throws SQLException{

try{
int codeP = insertPere();
int codeM = insertMere();

String query = "INSERT INTO fils_de (bac,code_p,code_m) VALUES (?,?,?)";
stat = cnx.prepareStatement(query);
stat.setString(1,txtBAC.getText());
stat.setInt(2, codeP);
stat.setInt(3, codeM);

stat.execute();

}catch(Exception ex){
JOptionPane.showMessageDialog(null, "Problème insertFils");
}
finally{
stat.close();
}
}

2 réponses

  1. J'ai l'impression qu'il faut utiliser la méthode .executeUpdate() et non pas .execute().

    ------------------------------------------------------------------------------------
    "La peur mène à la colère. La colère mène à la haine. Et la haine ... mène à la souffrance." - Yoda
    1. c'est ce que j'avais fait auparavant mais il n'est pas là le problème
  2. Modérateur
    Bonjour, S'il vous plait, Merci... Ce sont des mots plus qu'appréciés quand on pose un message sur un forum, nous ne sommes pas des robots !

    Quant au problème il faudrait voir où se trouve l'erreur (quelle ligne de code) mais tu utilises probablement deux fois le même statement pour deux requêtes distinctes, peut-être à ce niveau là :

    			int codeP = insertPere();
    			int codeM = insertMere();

    Pour éviter ça tu dois créer un nouveau statement pour chaque requête et le meilleur moyen d'y arriver est de ne pas utiliser un attribut de classe transverse à toute la classe mais d'en spécifier un nouveau dans chaque méthode.