Avatar billede baitianlong Nybegynder
16. juni 2008 - 20:51 Der er 2 kommentarer og
1 løsning

ResultSet is closed

Jeg har den mest underlige fejl:

java.sql.SQLException: Operation not allowed after ResultSet closed
    at com.mysql.jdbc.ResultSet.checkClosed(ResultSet.java:652)
    at com.mysql.jdbc.ResultSet.next(ResultSet.java:5942)
    at com.kpw.blogwatch.ReportGenerator.getUrgencyBlogsInTimeFrame(ReportGenerator.java:217)


I denne metode:

public List<Blog> getUrgencyBlogsInTimeFrame(Date sincedate) {
        List<Blog> results = new ArrayList<Blog>();
        try {
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM categorizedblog WHERE priority='3'");
            while(rs.next()) {
                String refindkey = rs.getString("refindkey");
                ResultSet rs2 = stmt.executeQuery("SELECT * FROM blog WHERE refindKey='" + refindkey + "' AND TIME_TO_SEC(TIMEDIFF('" + DatabaseFunctions.formatDateSQL(sincedate) + "',blogdate)) > 0");
                while(rs2.next()) {
                    Blog b = new Blog();
                    b.setRefindkey(rs2.getString("refindKey"));
                    b.setBlogdate(rs2.getTimestamp("blogdate"));
                    b.setTitle(rs2.getString("title"));
                    b.setUrl(rs2.getString("url"));
                    results.add(b);
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        Collections.sort(results);
        Collections.reverse(results);
        return results;
    }


Linie 217 er while(rs.next()) {

Det er noejagtig samme standard teknik jeg bruger i alle andre metoder, men i denne her synes den resultsettet er closed...

Kan nogen se hvorfor?
Avatar billede arne_v Ekspert
16. juni 2008 - 20:55 #1
Du udfører 2 queries på samme statement og connection. Det går ikke ! Jeg er ret sikker
på at fejlen skyldes at den anden stmt.executeQuery lukker rs.

Brug 2 connections og 2 statements til de 2 queries / result set.
Avatar billede baitianlong Nybegynder
16. juni 2008 - 22:31 #2
Hej Arne,

Connection con1 = createConnection();
        Connection con2 = createConnection();
        try {
            Statement stmt1 = con1.createStatement();
            ResultSet rs1 = stmt1.executeQuery("SELECT * FROM categorizedblog WHERE priority='3'");
            while(rs1.next()) {
                String refindkey = rs1.getString("refindkey");
                Statement stmt2 = con2.createStatement();
                ResultSet rs2 = stmt2.executeQuery("SELECT * FROM blog WHERE refindKey='" + refindkey + "' AND TIME_TO_SEC(TIMEDIFF('" + DatabaseFunctions.formatDateSQLFull(sincedate) + "',blogdate)) > 0");
                while(rs2.next()) {

Det var en god ide at lave flere connections. Den er holdt op med at brokke sig. Jeg synes nu ellers tidligere jeg har brugt samme connection og statement til at lave flere resultsets, men det kan vaere jeg ikke opdagede fejlen der...

Du kan i hvert fald inkassere dagens points fra mig her :) Og tak fordi du altid er klar til at hjaelpe.
Avatar billede arne_v Ekspert
16. juni 2008 - 23:00 #3
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester