java.sql.SQLException



  • Hallo ich programmiere grade eine Datenbankanbindung an ein Servlet. Dabei bekomme ich eine java.sql.SQLException. Diese besagt dass die Aktion nicht ausgeführt werden kann, weil das Resultset schon geschlossen ist. Ich weiss nur nicht warum. Der folgende Code ist meine Datenbankklasse, die von einer abstrakten Klasse DBControler erbt, die 4 Methoden hat, eine zum starten der Datenverbindung, einen zum schliessen der Datenbank, eine zum ausführen eines updates der Datenbank und eine Datenbankabfrage mit rückgabe des ResultSet.

    Ich poste hier mal nur die Methode die schiefgeht, der Fehler kommt beim Eintritt in die while schleife.

    public Vector readUsers () 
         { 
              System.out.println("Methode readUsers zur Ausgabe aller Tupel aufgerufen..."); 
              Vector dat = new Vector (); 
              System.out.println("neuer Vektor erstellt..."); 
    
              try 
              { 
                   this.startConnection(); 
                   System.out.println("Sende String 'USE simplex'..."); 
                   String sql = "USE simplex;"; 
                   this.updateStmt(sql); 
                   sql = "SELECT * FROM login;"; 
                   System.out.println("Sende String 'SELECT * FROM login'..."); 
                   ResultSet tmp = this.queryStmt(sql); 
    
                   System.out.println("Eintritt in kritischen Bereich jetzt..."); 
                   //solange bis alle Datensätze durchgegangen wurden 
                   System.out.println("Eintritt in while-schleife jetzt..."); 
    
                   while (tmp.next()) 
                   { 
    
                        System.out.println("Eintritt in Leseschleife..."); 
                        //erstelle neue Datenbankbean 
                        tables.Login tbean = new tables.Login (); 
                        System.out.println("Neue Datenbankbean login erstellt"); 
    
                        //Daten in Bean schreiben 
                        tbean.setId(Integer.parseInt(tmp.getString(1))); 
                        tbean.setUser(tmp.getString(2)); 
                        tbean.setScreenname(tmp.getString(3)); 
                        tbean.setPwd(tmp.getString(4)); 
                        tbean.setEmail(tmp.getString(5)); 
                        tbean.setPhone(tmp.getString(6)); 
                        tbean.setMobile(tmp.getString(7)); 
                        tbean.setName(tmp.getString(8)); 
                        tbean.setCallname(tmp.getString(9)); 
                        tbean.setCompany(tmp.getString(10)); 
    
                        //Bean in Vektor speichern 
                        System.out.println("Einfügen der Bean in den Vektor..."); 
                        dat.addElement(tbean); 
                  } 
             } 
    
             catch (SQLException sqlerr) 
             { 
                  sqlerr.printStackTrace(); 
             } 
    
             catch (NullPointerException ne) 
             { 
                  ne.printStackTrace(); 
             } 
    
             this.closeConnection(); 
             return dat; 
    
         }
    


  • nimm mal alle semikolons in den sql strings weg... da gehören keine hin.



  • Danke für den Tipp aber das bringt leider überhaupt nix die fehlermeldung bleibt weiterhin bestehen.
    Kann mir einer vielleicht sagen wie ich überprüfen kann, ob das ResultSet gültig ist oder nicht?



  • Kannst du mal den Stacktrace posten?



  • beachte auch den unterschied zwischen executeQuery und executeUpdate, siehe http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Statement.html .

    executeQuery nimmst du gewöhnlich für select-anweisungen, executeUpdate für insert, update und delete-anweisungen.



  • mir ist der unterschied zwischen den beiden Methoden durchaus klar. Hier geht es darum die Daten aus der Datenbank auszuwählen.

    INFO: Jk running ID=0 time=0/47 config=null
    11.03.2004 14:33:55 org.apache.catalina.startup.Catalina start
    INFO: Server startup in 6718 ms
    Methode readUsers zur Ausgabe aller Tupel aufgerufen...
    neuer Vektor erstellt...
    Sende String 'USE simplex'...
    Sende String 'SELECT * FROM login'...
    Eintritt in kritischen Bereich jetzt...
    Eintritt in while-schleife jetzt...
    java.sql.SQLException: Operation not allowed after ResultSet closed
    at com.mysql.jdbc.ResultSet.checkClosed(ResultSet.java:3562)
    at com.mysql.jdbc.ResultSet.next(ResultSet.java:2406)
    at dbi.Login.readUsers(Login.java:125)
    at org.apache.jsp.web.databaseadmin_jsp._jspService(databaseadmin_jsp.ja
    va:54)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:136)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper
    .java:320)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:2
    94)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
    icationFilterChain.java:286)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
    ilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
    alve.java:253)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
    eContext.java:151)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
    a:564)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(Standard
    ContextValve.java:256)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
    alve.java:210)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
    eContext.java:151)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
    a:564)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
    ava:190)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
    eContext.java:151)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
    ava:175)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
    eContext.java:149)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
    a:564)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
    ve.java:156)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
    eContext.java:151)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
    a:564)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:974)

    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:20
    7)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java
    :637)
    at org.apache.coyote.http11.Http11ProtocolHttp11ConnectionHandler.processConnection(Http11Protocol.java:488)atorg.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:568)atorg.apache.tomcat.util.threads.ThreadPoolHttp11ConnectionHandler.proce ssConnection(Http11Protocol.java:488) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java :568) at org.apache.tomcat.util.threads.ThreadPoolControlRunnable.run(ThreadP
    ool.java:631)
    at java.lang.Thread.run(Thread.java:534)
    Methode zum Schliessen der Datenbankverbindung aufgerufen...
    Ge÷ffnete Datenbankverbindung entdeckt...
    Datenbankverbindung geschlossen...

    So das ist der Stack auf der Konsole. Einige Meldungen sind Debugmeldungen die von mir generiert wurden. Sie schliessen sich dann mit '...' ab. Wie ihr seht kommt die Exception nach eintritt in die whileschleife.

    Ich poste hier nochmal die methode, die zum ausführen des sql statements verantwortlich ist:

    /**     * Setzt SQL-Abfragen ab und liefert ein java.sql.ResultSet zurück.     */
         public ResultSet queryStmt(String abfr)
         {
               ResultSet rs = null;
    
               try
               {
                    stmt = con.createStatement();
                    rs = stmt.executeQuery(abfr);
                    stmt.close();
               }
    
               catch(SQLException e)
               {
                    e.printStackTrace();
               }
    
               return rs;
         }
    


  • Ich vermute es hat was mit dem Schließen des Statements zu tun. Anscheinend benötigt das ResultSet eine geöffnetes solches.



  • Natürlich hat es das. Nur ich schliesse das ResultSet doch gar nicht! Die Fehlermeldung sagt ja aus das es was damit zu tun hat! Aber ich schliesse das ResultSet nirgens... Das ist ja das komische. Ist ja auch klar dass ich das nur machen kann wenn das ResultSet geöffnet ist



  • Ich sprach vom Statement.


Anmelden zum Antworten