2011-12-13 3 views
2

JDBCコードに問題があります。これは、関連するコードです:SQLException:Exhausted Resultset

/** 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 –

答えて

5
result.next(); 

storedPassword = result.getString("passwd"); 

次の戻り値はチェックしていません。行がない場合は、問題が発生します。

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

これは動作します!ありがとう! –

4

問題はコードではなく、データベースになる可能性があります。テーブルが空ではないことを再度確認します。テーブルが空の場合、このエラーが発生します。オラクルのようなデータベースではinsert, update, alter statementsの後にcommitが必要であることを覚えておいてください。あなたのdbに対してコミットを実行するまで、あなたの変更がデータベース外に見えないかもしれません。私はselectステートメントでテーブルをチェックし続けましたが、私のoracle dbの問題は、私がdbをコミットしなかったということでした。

+0

それは非常に有用thnxだった! – xXxpRoGrAmmErxXx

2

oracleデータベースにcharの代わりにvarcharデータ型を使用してください。

あなたがcharを使用する場合、データベースの空白と実際のサイズは、クエリパラメータ

と比較され、クエリのdoesntのは、それが結果が偽なっているexucutedます。

したがって、oracleデータベースでvarcharデータ型を使用します。