2011-12-13 64 views
2

我的JDBC代码有问题。这是相关代码:SQLException:用尽结果集

/** method for checking password into the Oracle database */ 
public String CheckUserDB(String userToCheck) throws SQLException { 
    String storedPassword; 
    if (ds == null) throw new SQLException("No data source");  
    Connection conn = ds.getConnection(); 
    if (conn == null) throw new SQLException("No connection");  

    try { 
    conn.setAutoCommit(false); 
    boolean committed = false; 
    try { 
     PreparedStatement passwordQuery = conn.prepareStatement(
     "SELECT passwd from USERS WHERE userz = ?"); 
     passwordQuery.setString(1, userToCheck); 

     ResultSet result = passwordQuery.executeQuery(); 

     result.next(); 

     storedPassword = result.getString("passwd");       

     conn.commit(); 
     committed = true; 
    } finally { 
     if (!committed) conn.rollback(); 
    } 
    } 
    finally {    
    conn.close(); 
    }  
    return storedPassword; 
} 

这是个例外:

java.sql.SQLException: Exhausted Resultset 
    oracle.jdbc.driver.OracleResultSetImpl.getString(OracleResultSetImpl.java:1270) 
    oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:494) 
    org.jboss.jca.adapters.jdbc.WrappedResultSet.getString(WrappedResultSet.java:1359) 
    com.dx.sr_57.user_check.CheckUserDB(user_check.java:100) 
    com.dx.sr_57.user_check.user_compare(user_check.java:123) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:601) 
    org.apache.el.parser.AstValue.invoke(AstValue.java:196) 
    org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) 
    com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) 
    javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) 
    com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 
    javax.faces.component.UICommand.broadcast(UICommand.java:315) 
    javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) 
    javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) 
    com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 

这是怎么造成的,我该如何解决呢?

+0

我认为这个链接将帮助你跟踪你的问题,由于结果集http://stackoverflow.com/questions/3502005/java-sql-sqlexception-exhausted-resultset – 2011-12-13 20:51:09

回答

5
result.next(); 

storedPassword = result.getString("passwd"); 

您不检查下一个的返回值。如果你没有行,你会遇到麻烦......

if(result.next()){ 
    storedPassword = result.getString("passwd"); 
} 
+0

它的工作原理!谢谢! – 2011-12-13 21:15:47

4

问题可能不在于代码,而可能是数据库。仔细检查表格不是空的。如果表格为空,则会出现此错误。请记住像Oracle这样的数据库在所有insert, update, alter statements之后都需要commit。在数据库之外,您的更改可能在数据库之外是不可见的,除非您在数据库上运行提交之前,我遇到了相当长的问题。我继续用select声明检查表,但是我的oracle数据库的问题是我没有发布对我的数据库的提交。

+0

这是非常有益thnx! – xXxpRoGrAmmErxXx 2016-07-10 21:49:29

2

在oracle数据库中使用varchar数据类型而不是char

如果您使用的数据库的空白空间与查询参数

和查询相比,焦炭则实际大小

犯规得到exucuted是结果得到假的。

因此,在oracle数据库中使用varchar数据类型。