Java SQL ResultSet异常 [英] Java SQL ResultSet Exception

查看:106
本文介绍了Java SQL ResultSet异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用JSF& PrimeFaces.我有两个班级& Inputs& DBConn.而且我正在执行这样的SQL命令

I'm Developing a Web Application using JSF & PrimeFaces. I have two classes Inputs & DBConn. And i'm executing a SQL command like this

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

然后在 DBConn类中,我在while循环条件内调用 ResultSet对象上的 next()方法以打印结果

And then in the DBConn class i call the next() method on the ResultSet object inside a while loop condition to print the result.

这很好,可以给我输出.

This works fine and gives me an output.

但是,当我尝试调用该 ResultSet对象,以使用上述相同场景(在 Inputs类内部使用while循环)获取输出时,会得到以下内容

But when i try to call that ResultSet object to get an output using the same scenario above (using that while loop inside the Inputs class) it gives me the following exception.

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)

然后我认为,尽管我再次使用 next()方法,但在第一次使用 next()方法之后,光标仍在最后strong>输入法类.

Then i assumed that after the first use of the next() method the cursor is still in the end though i used the next() method again in that Inputs class.

因此,我尝试使用 .beforeFirst()方法,然后转到第二个while循环以将光标重置回顶部.但这又给了我同样的错误.

So i tried using the .beforeFirst() method before going to the 2nd while loop to reset the cursor back to the top. But it gave me the same error again.

然后,我尝试注释我在 DBConn类中访问的第一个while循环,因此光标肯定在顶部.但是,这给了我以下错误.

Then i tried commenting the 1st while loop i access in the DBConn class so the cursor is at the top for sure. But then it gives me the following error.

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感到抱歉,我将它们用于调试.

How do i resolve this? This is my first time developing a Database Application. And sorry about these bunch of sys.prints, I used them for debugging.

这是与此案例相关的两个类:

These are the two classes related to this case:

输入类

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

}

推荐答案

我认为问题出在获取结果集的方式上.每次调用nCon.getResultSet()时,它都会返回一个新的结果集.这意味着您调用一个结果集对象的next方法,并在另一个结果集对象中调用getString(1).这是我的解决方法.

I think the problem is in the way you get the resultset. Each time you call nCon.getResultSet() it returns a new resultset. That means you call next method of one resultset object and calls getString(1) in another. Here is my solution.

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

这篇关于Java SQL ResultSet异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆