fonction recursive d'affichage avec requete inside
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:
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:
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:
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