2016-05-02 22 views
0

Ich versuche, eine SQL-Abfrage übergeben, aber ich bekomme "java.sql.SQLException: Operation nicht erlaubt, nachdem ResultSet geschlossen". Ich habe andere Konversation basierend auf der gleichen Ausnahme in Stackoverflow durchlaufen, aber ich verstehe das Problem nicht. Hier'ResultSet ist geschlossen' bei resultset Funktion

ist der Code:

Class.forName("com.mysql.jdbc.Driver").newInstance(); 
String query="SELECT candidate,pan from hcl_candidates where jngstat='Joined'"; 

statement=conn.createStatement(); 
resultset=statement.executeQuery(query); 

while(resultset.next()){ 

statement.executeUpdate("insert IGNORE into allinvoice  (candidate,pan,invdate,client) select candidate,pan,CURDATE(),'HCL' from hcl_candidates where jngstat='Joined'"); 
} 
} 

catch (SQLException ex) 
{ 
ex.printStackTrace(); 
out.println("Unable to connect to batabase."); 

} 

finally 
{ 
try 
{ 

if(statement!=null) 
{ 
statement.close(); 
} 
if(conn!=null){ 
conn.close(); 
} 

if(resultset!=null){ 
resultset.close(); 
} 
} 
catch (SQLException e) 
{ 

e.printStackTrace(); 
} 
} 

hier ist die komplette Stack Trace:

java.sql.SQLException: Operation not allowed after ResultSet closed 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860) 
    at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:743) 
    at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6320) 
    at org.apache.jsp.hclimport_jsp._jspService(hclimport_jsp.java:92) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
+0

Ihr Programm wird nicht blockiert. – EJP

Antwort

0

Die erneute Ausführung der Statement schließt die vorherige Ergebnismenge.

Es ist schwer zu verstehen, was Sie hier zu tun glauben, eine Anweisung in einer Schleife auszuführen, die nicht auf irgendetwas angewiesen ist, das die Schleife ändert.

Hinweis: Eine SQLException kann eine Menge Dinge außer 'nicht verbinden' bedeuten.

+0

danke für den Hinweis auf die Schleife, jetzt funktioniert es .. ich sollte es löschen, aber es muss meine Gedanken übersprungen haben :) – pradyu

-1

Das Problem ist mit der executeUpdate in einer while Schleife auf dem gleichen Statement-Objekt ausgeführt wird. Dies verletzt die Erwartung der Statement class.

PS: Sie sollten zuerst die Ergebnismenge, Anweisung und dann Verbindung schließen.

+0

Hallo ich habe meine Stack-Trace hinzugefügt ... bitte lassen Sie mich wissen, wenn Sie etwas wissen – pradyu

+0

'while' Schleifen nicht 'Statement' Klasse' verletzen. – EJP

+0

Es ist nicht die While-Schleife als solche. Meine Absicht war zu sagen, dass die Ausführung des 'executeUpdate' auf dem gleichen' Statement' Objekt das Problem verursacht hat. Bitte beachten Sie das Oracle-Dokument der 'Statement' Klasse http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html – redoc