2014-10-17 62 views
2

我在開發使用JSF的Web應用程序& PrimeFaces。我有兩個類輸入& DBConn。和即時執行SQL命令這樣Java SQL結果集異常

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

然後在DBConn i類調用一個while循環的條件內的下一個()ResultSet對象上的方法來打印結果。

這工作正常,並給我一個輸出。

但是當我嘗試調用ResultSet對象使用上述相同的情況下獲得的輸出(使用而輸入類內循環),它給了我下面的異常。

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) 

然後我假定第一使用下一個()方法的後光標仍在到底雖然我在輸入類再次使用下一個()方法。

所以我嘗試使用.beforeFirst()方法之前去第二while循環重置光標回到頂部。但它再次給了我同樣的錯誤。

然後我試着評論第一個while while循環,我訪問DBConn類,所以遊標確實位於頂部。但是,它給了我以下錯誤。

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) 

我該如何解決這個問題?這是我第一次開發數據庫應用程序。 對於這些sys.prints,我使用它們進行調試。

這些是與此相關的情況下,兩個類:

輸入級

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類

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; 
} 

} 
+0

只是一個觀察,'REQUEST_DATE = '01 -AUG-2014''這是處理日期的這種不正確的方式。由於隱式數據轉換,您將很快遇到性能問題。如果請求日期是日期數據類型,則使用'TO_DATE(01-AUG-2014)'。 – 2014-10-17 06:53:24

+0

@LalitKumarB我做了這個測試目的。我只是想看看它是否會起作用。順便說一句,謝謝你的擡頭。 – k9yosh 2014-10-17 08:00:12

回答

1

我認爲這個問題是在你的方式結果集。每次調用nCon.getResultSet()時,都會返回一個新的結果集。這意味着你調用一個resultset對象的下一個方法,並在另一箇中調用getString(1)。這是我的解決方案。

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 { 
     ResultSet rst=nCon.getResultSet(); 
     rst.beforeFirst(); 
     while(rst.next()){ 
      System.out.println("++++++++++++"); 
      String str=rst.getString(1); 
      System.out.println("++++++++++++"); 
      setShowRes(str); 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("777777777777777777777"); 
} 
0

你getResultMethod()結尾是把光標的ResultSet。而出現這種異常,因爲你是不是下一個調用()和試圖訪問的ResultSet在以下方法

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)); //here rs.next() should be called first 
     //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"); 
} 

解決方案

try{ 

    while(rs.next()){ 
     System.out.println(nCon.getResultSet().getString(1)); 
    } 
...... 
} 
+0

這就是我所做的對嗎?我的getResultSet()返回rs對象。 – k9yosh 2014-10-17 08:04:39

+0

但是在getResultSet()方法中,您正在迭代所有ResultSet,然後在末尾使用遊標返回ResultSet。所以當你調用nCon.getResultSet()。getString()時,Cursor在你調用的時候結束,它不會給出任何輸出。 – 2014-10-17 09:06:14

+0

是的,但後來我省略了循環,因此光標位於頂部的原始位置。然後它給了我上面提到的第二個錯誤。 – k9yosh 2014-10-18 04:12:50