Bonjour,

j'ai une table dans laquelle sont stockee des categories liees entre elle par une cle etrangere report_id.
Je precise tout de suite que je seche aussi sur une solution SQL pure a ce probleme par l'utilisation de ON CASCADE DELETE, mais je n'arrive pas. j'utilise MySQL.

Donc ma premiere idee etait une fonction jsp. J'ai deja ecrit une fonction recursive de parcours de ma table qui me cree un menu dynamique et qui fonction tres bien. Je me suis donc inspire de ce code pour ecrire celle-ci qui est a priori plus simple. Mais apres avoir ecrit 3-4 versions differentes la je seche sur le meme message d'erreur depuis des heures, voci mes codes:

page jsp:
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
    <%  
        //get session variables
        int par = 0;
        int lev = 0;
        String strParent = session.getAttribute("S_Parent").toString();
        String strLevel = session.getAttribute("S_Level").toString();
        par = Integer.parseInt(strParent);
        lev = Integer.parseInt(strLevel);
        
        // other variables
        String name = "";
        String sql = "";
        int n=0;
        int i=0;
 
        // get all the lines at that level
        rs = statement.executeQuery("SELECT * FROM REPORT WHERE REPORT_PARENT=" + par + " AND REPORT_LEVEL=" + lev + " ORDER BY REPORT_ID");
        
        // for each
        while (rs.next()){
            i++;             
            int id = rs.getInt(1);
            name = rs.getString(2);
            
            String S_Nom = "chk" + i;
            String str = session.getAttribute(S_Nom).toString();
            
            // was the report checked ?
            if (str.compareTo("no")!=0){
                
                out.println("report checked :" + name + "<br>");
                
                // deleting of the first entity
                sql= sql.concat("DELETE FROM REPORT WHERE REPORT_ID='" + id + "';");
                //statement.executeUpdate(sql);
 
                // is it a category ?
                
                if (rs.getString(4).compareTo("Y")==0){
                    Menu m = new Menu();
                    out.println("prepare to enter function <br>");
                    sql =sql.concat(m.deleteCascade(connection, statement, id));
                }     
            }
        }
        
        rs.close();
        out.println("<br>sql : " + sql);
      
    %>
et fonction 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
43
44
45
46
47
public String deleteCascade(Connection conn, Statement st, int parent)throws IOException {
 
    String response = new String("<br>debut : " + parent + "<br>");
    String sql = new String("");
    String hs="";
    int dad = 0;
    int n = 0;
 
    try{    
        sql = "SELECT * FROM REPORT WHERE REPORT_PARENT='" + parent + "' order by REPORT_ID";
        ResultSet rs = null;
        rs = st.executeQuery(sql);
 
        // resultset exploration
        while (rs.next()){
            // we need to memorize the row in the resultset
            n = rs.getRow();
            hs =rs.getString(4);
            dad=rs.getInt(1);
 
            response = response.concat("DELETE FROM REPORT WHERE REPORT_PARENT='" + dad + "';");
 
            // if the report has kids, it's a label, we print the name and make a sub menu 
            // by recalling the function with the new data
            if(hs.compareTo("Y")==0){
                Menu m = new Menu();
                dad = rs.getInt(1);
 
                // recursive call of the function
                response = response.concat(m.deleteCascade(conn, st,dad)); 
 
                // the resultset being closed in the call of the function, we have to recreate it
                rs = st.executeQuery(sql);
                for(int d=1; d<=n; d++){
                    rs.next();
                }            
            }
        }
        rs.close();
    }
    catch (SQLException E){
        System.err.println(E.getMessage());
        response = response.concat(E.getMessage());
    }
 
    return response;
}
Dans cette derniere version je ne fais plus de delete dans la fonction, je copie les requetes dans une chaine de caracteres que je renvoie.

L'execution genere une exception a l'entre du try, due a la requete. Et le message d'erreur est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Operation not allowed after ResultSet closed
An SQL exception occured.
Sauf que je n'ai ferme aucun resultSet a ce moment la.

Merci