web-dev-qa-db-fra.com

rs.last () donne une opération non valide pour le résultat uniquement: dernier

J'essaie d'obtenir le nombre de lignes d'un résultat défini par:

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

mais im obtenir une erreur Invalid operation for forward only resultset : last. L'ensemble de résultats extrait ses données d'une base de données Oracle 10g.

Voici comment j'ai configuré ma connexion:

    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);
14
Mike

ResultSet.last() et les autres opérations de requête "index absolu" ne sont disponibles que lorsque le jeu de résultats est scrollable ; sinon, vous ne pouvez parcourir qu'un par un les ensembles forward-only result.

L'exemple suivant (from the javadocs ) montre comment créer une variable ResultSet à défilement. 

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

N'oubliez pas que l'utilisation de requêtes à défilement a des conséquences sur les performances. Si l'objectif de cette ResultSet particulière est uniquement de saisir sa dernière valeur, pensez à affiner votre requête pour ne renvoyer que ce résultat.

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

Pour les instructions préparées, vous devez spécifier au minimum le type et le mode d'accès simultané pour que last() et isLast() fonctionnent.

5
Mahdi Esmaeili

Merci à cheeken (2 posts ci-dessus), mais en Java 1.8, la fonction createStatement () nécessite désormais 2 paramètres

exemple:

stmt 
  = conx.createStatement
      (ResultSet.TYPE_SCROLL_INSENSITIVE
      ,ResultSet.CONCUR_READ_ONLY
      );
0
schlebe