2012-01-25 5 views
13

を、私は結果セットの行数を取得しようとしています:rs.last()は、前方専用の結果のために不正な操作を提供します:最後

rs.last(); 
int row_count = rs.getRow(); 

しかしイムInvalid operation for forward only resultset : lastエラーを取得します。結果セットは、Oracle 10gデータベースからデータを取得しています。ここで

は私が私の接続設定方法です:

Class.forName("oracle.jdbc.driver.OracleDriver"); 
    String connectionString = "jdbc:oracle:thin:@" + oracle_ip_address + ":" + oracle_db_port + ":" + oracle_db_sid; 
    Connection conn = DriverManager.getConnection(connectionString, oracle_db_username, oracle_db_password); 

答えて

23

ResultSet.last()をし、結果セットがスクロールあるときに、他の「絶対にインデックス」問合せ操作のみが利用可能です。それ以外の場合は、forward-only結果セットを使用して、1つずつ順番にしか反復できません。

次の例(the javadocs)は、スクロール可能なResultSetの作成方法を示しています。

Statement stmt = con.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE, 
    ResultSet.CONCUR_READ_ONLY 
); 
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2"); 

スクロール可能なクエリを使用するとパフォーマンスに影響があります。この特定のResultSetの目標が最後の値を取得するだけである場合は、その結果のみを返すようにクエリを絞り込むことを検討してください。プリペアドステートメントのために

+2

は、我々は2つのパラメータを追加する必要がありますcheekenによって説明されているように、ResultSet.TYPE_SCROLL_INSENSITIVEを渡す必要がありますが、それに1つ以上のパラメータを渡す必要があります。これを参照してください。 - createStatement() - 'Statement statement = con.createStatement(resultSetType、resultSetConcurrency) 'resultSetType結果セット型。 ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE、またはResultSet.TYPE_SCROLL_SENSITIVEのいずれかです。 resultSetConcurrencyは同時実行型です。 ResultSet.CONCUR_READ_ONLYまたはResultSet.CONCUR_UPDATABLE'のいずれか – OverrockSTAR

+0

javadocsのリンクが壊れています – KAD

+0

'Statement stmtを実行しようとすると、' Connection型のメソッドcreateStatement()が引数(int) = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE ); ' – Squareoot

4
PreparedStatement ps = conn.prepareStatement ("SELECT * FROM 
     EMPLOYEE_TABLE WHERE LASTNAME = ?" , 
     ResultSet.TYPE_SCROLL_INSENSITIVE , 
     ResultSet.CONCUR_UPDATABLE , 
     ResultSet.HOLD_CURSOR_OVER_COMMIT) ; 

、あなたが動作するように、最低でも、タイプlast()isLast()の並行処理モードの両方を指定する必要があります。 (上記の2ポスト)cheekenが、Java 1.8で、のcreateStatement()関数は、現在2パラメータ

たとえば、必要に

+0

isLast()では、カーソルをスクロール可能にする必要はありません。 last()はそれを必要とします。 –

0

ありがとう:最新の仕様に従って、

stmt 
    = conx.createStatement 
     (ResultSet.TYPE_SCROLL_INSENSITIVE 
     ,ResultSet.CONCUR_READ_ONLY 
    ); 
関連する問題