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