Java SQL ResultSet Exception

Je suis le Développement d'une Application Web en utilisant JSF & PrimeFaces. J'ai deux classes d'Entrées & DBConn. Et je suis de l'exécution d'une commande SQL comme ceci

SQL="SELECT COUNT(*) FROM TXN_HEADER WHERE REQUEST_DATE='01-AUG-2014'"

Et puis dans le DBConn classe j'appelle le next() méthode sur la objet ResultSet à l'intérieur d'une boucle while condition pour imprimer le résultat.

Cela fonctionne bien et me donne une sortie.

Mais quand j'essaie d'appeler que objet ResultSet pour obtenir un résultat en utilisant le même scénario ci-dessus (à l'aide que lors de la boucle à l'intérieur de la Entrées classe) il me donne l'exception suivante.

java.sql.SQLException: Result set after last row
at oracle.jdbc.driver.GeneratedScrollableResultSet.getString(GeneratedScrollableResultSet.java:879)
at Inputs.commandButton(Inputs.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.el.parser.AstValue.invoke(AstValue.java:245)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:277)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

Puis j'ai supposé que, après la première utilisation de la next() méthode, le curseur est toujours à la fin, bien que j'ai utilisé le next() méthode à nouveau dans ce Entrées classe.

J'ai donc essayé d'utiliser le .beforeFirst() méthode avant de passer à la 2ème boucle while pour réinitialiser le curseur vers le haut. Mais il m'a donné la même erreur à nouveau.

Ensuite, j'ai essayé de commenter la 1ère boucle while j'ai accès à la DBConn classe de sorte que le curseur est au dessus pour vous. Mais alors, il me donne l'erreur suivante.

java.sql.SQLException: ResultSet.next was not called
at oracle.jdbc.driver.GeneratedScrollableResultSet.getString(GeneratedScrollableResultSet.java:874)
at Inputs.commandButton(Inputs.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.el.parser.AstValue.invoke(AstValue.java:245)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:277)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

Comment puis-je résoudre ce problème? C'est ma première fois développement d'une Application de Base de données.
Et désolé pour ces tas de sys.imprime, je les ai utilisés à des fins de débogage.

Ce sont les deux classes liées à ce cas:

Entrées Classe

import java.sql.SQLException;
import javax.annotation.ManagedBean;
@ManagedBean
public class Inputs {
private String date;
private String showRes;
public String getDate() {
return date;    
}
public void setDate(String date) {
this.date = date;
}
public String getShowRes() {
return showRes;
}
public void setShowRes(String showRes) {
this.showRes=showRes;
}
public void commandButton(){
DBConn nCon=new DBConn();
Calculations nCalc=new Calculations();
nCalc.setPieChartSQL(getDate());
nCon.setSQL(nCalc.getPieChartSQL());
System.out.println("............");
System.out.println(nCon.getResultSet());
System.out.println("............");
System.out.println(nCon.getResultSet());
System.out.println("............");
try {
System.out.println(nCon.getResultSet().getString(1));
//nCon.getResultSet().beforeFirst();
while(nCon.getResultSet().next()){
System.out.println("++++++++++++");
System.out.println(nCon.getResultSet().getString(1));
System.out.println("++++++++++++");
setShowRes(nCon.getResultSet().getString(1));
}
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("777777777777777777777");
}
}

DBConn Classe

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.pool.OracleDataSource;
public class DBConn {
private String sql;
private ResultSet rs;
public ResultSet getResultSet(){
try {
OracleDataSource dataSource=new OracleDataSource();
dataSource.setURL("jdbc:oracle:thin:@172.16.20.45:1521:ABS");
dataSource.setUser("ABS_INP");
dataSource.setPassword("b2a6b224");
OracleConnection con = (OracleConnection)dataSource.getConnection();
con.setAutoCommit(false);
Statement stmnt = con.createStatement();
rs = stmnt.executeQuery(sql);
System.out.println("-----------");
System.out.println(rs);
System.out.println("-----------");
System.out.println(rs);
System.out.println("-----------");
while(rs.next()){
System.out.println("*************");
System.out.println(rs.getString(1));
System.out.println("*************");
}
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public void setSQL(String sql) {
this.sql=sql;
}
}
  • Juste une observation, REQUEST_DATE='01-AUG-2014' C'est une mauvaise façon de traiter avec les dates. Vous serez plus tôt en cours d'exécution dans les problèmes de performance en raison de la conversion implicite de données. Si la demande de la date de date de type de données, puis utiliser TO_DATE(01-AUG-2014).
  • Je l'ai fait pour des fins de test. Je voulais juste voir si ça va fonctionner. BTW, merci pour le heads up.
InformationsquelleAutor k9yosh | 2014-10-17