Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    115

    java.sql.SQLException: Resultset esaurito

    Ciao,
    ho un semplice programma java che esegue una connessione ad un db oracle e effettua delle select su di esso.
    Il programma dopo un poò che in runtime si interrompe con il seguente errore

    java.sql.SQLException: Resultset esaurito

    e non ne capisco il motivo.

    Uso sempre lo stesso oggetto Connection . Uso un oggetto Statement stmt che chiudo ogni volta che termino di lavorare sulla query e resultSet differenti per ogni query, resulSet che chiudo insieme all'oggetto Statement al termine delle operazioni.
    Devo scorrere un migliaio direcord ma dopo circa 300 l'elaborazione si interompe con quel messaggio.
    Dove sbaglio?


    Allego il codice

    codice:
    public static void main(String [] args){
    
    		Connection con = null;
    		Statement stmt = null;
    		ResultSet rs = null;
    		PreparedStatement prep = null;
    		
    		ResultSet rsRecuperaUtente = null;
    		ResultSet rsDatiRagSociale = null;
    		ResultSet rsDatiConsumo = null;
    		ResultSet rsImportoConsumo = null;
    		ResultSet rsDatiTestata = null;
    		ResultSet rsDatiDettaglio = null;
    		
    		PrintStream ps = null;
    		
    
    		
    		//Connessione al database Oracle
    		try {
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    		
    			// Create a connection to the database
    			String serverName = "##########";
    			String portNumber = "1521";
    			String sid = "####";
    			String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
    			String username = "###";
    			String password = "###";
    			con = DriverManager.getConnection(url, username, password);
    
    
    			//apro il file su cui andare a srivere
    			..........................
    			.....................................
    
    
    			stmt = con.createStatement();
    			rs = stmt.executeQuery("SELECT U23C_BOL FROM KK_TESUTF2");
    			int contaBollette = 0;
    			
    			while (rs!=null && rs.next()) {
    				
        			String numBolletta = rs.getString("U23C_BOL");
        			ps.print("................................
        			contaBollette++;
        			
        			
        			stmt = con.createStatement();
        			rsRecuperaUtente = stmt.executeQuery("select u32c_ute from KK_TESUTF2 where u23c_bol='" + numBolletta +"'");
        			rsRecuperaUtente.next();
        			int codUtente = rsRecuperaUtente.getInt("u32c_ute");
        			stmt.close();
        			rsRecuperaUtente.close();
        			
        			
        			stmt = con.createStatement();
        			rsDatiRagSociale = stmt.executeQuery("select ac_rg_cli from ce_an_clie where ac_c_cli='" + codUtente + "'");
        			rsDatiRagSociale.next();
        			ps.print.........................
        			stmt.close();
        			rsDatiRagSociale.close();
        			
        			stmt = con.createStatement();
        			rsDatiTestata  = stmt.executeQuery("select * from KK_TESUTF2 where u23c_bol='" + numBolletta +"' ");
        			rsDatiTestata.next();
        			ps.print(rsDatiTestata.getString("U92DE_VIA") +  "	" + rsDatiTestata.getString("U13C_N_CIV") + "	");
        			ps.print(rsDatiTestata.getString("U92C_CAP") +  "	" + rsDatiTestata.getString("U92C_S_CAP")+  "	" + rsDatiTestata.getString("U92DE_LOCA"));
        			String dataIn = ............
        			String dataFn = .................
        			String dataEmis = .....................
        			ps.print................................................................
        			ps.println("");
        			stmt.close();
        			rsDatiTestata.close();
        			
        			stmt = con.createStatement();
        			rsDatiConsumo = stmt.executeQuery("select (U21Q_L_ATU - U21Q_L_PRE) from ut_bl_cont where u21c_bol = '" + numBolletta +"'");
        			rsDatiConsumo.next();
        			ps.print("....................................................
        			stmt.close();
        			rsDatiConsumo.close();
        			
        			stmt = con.createStatement();
        			rsImportoConsumo = stmt.executeQuery("SELECT U22C_BOL, U22C_IVA, U22C_A_IVA,  SUM(U22VALONUM_E), U22IMIMPOS_E FROM KK_DETUTF2 WHERE U22C_BOL='" + numBolletta + "' and U18DE_VCE like 'IMPORTO GAS%' group by U22C_BOL, U22C_IVA, U22C_A_IVA, U22IMIMPOS_E");
            			if (rsImportoConsumo!=null) {
        				rsImportoConsumo.next();
        				double impConsumo = rsImportoConsumo.getDouble(1);
        			}	
        			
        			stmt.close();
        			rsImportoConsumo.close();
    
    
    			}
    
    		
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			ps.close();
    		}
    	}

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    356
    al posto di fare

    while (rs!=null && rs.next())

    prova a fare

    while(rs!=null)
    {
    //tutte le operazioni che devi fare

    rs.next();
    }
    Jekkil

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da Jekkil
    al posto di fare

    while (rs!=null && rs.next())

    prova a fare

    while(rs!=null)
    {
    //tutte le operazioni che devi fare

    rs.next();
    }
    No: appena creato il puntatore nel recordset è posizionato prima del primo record, quindi è corretto un rs.next() come prima istruzione.

    Non si riesce a capire quale sia il ResultSet che fa sollevare questa eccezione. Di sicuro non va bene il modo in cui effettui le operazioni all'interno del ciclo while: per nessuno dei resultset ottenuti al suo interno effettui un test per verificare che vi siano effettivamente dei record contenuti. Ti limiti a richiamare next() senza testarne il valore boolean di ritorno.

    Se uno di quei Resultset è vuoto (e immagino sia così), la successiva chiamata a getString() fa sollevare l'eccezione.

    Prendo un pezzo del tuo codice a caso per farti capire:
    codice:
    rsDatiTestata  = stmt.executeQuery("select * from KK_TESUTF2 where u23c_bol='" + numBolletta +"' ");
    rsDatiTestata.next();
    ps.print(rsDatiTestata.getString("U92DE_VIA") +  "	" + rsDatiTestata.getString("U13C_N_CIV") + "	");
    Nella prima riga ottieni il ResultSet. OK
    Nella seconda chiami next() senza controllarne il valore di ritorno. SBAGLIATO!
    Nella terza, che succede se il ResultSet è vuoto (e quindi la next() aveva prodotto false)? Salta fuori l'eccezione!


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    356
    Originariamente inviato da LeleFT
    No: appena creato il puntatore nel recordset è posizionato prima del primo record, quindi è corretto un rs.next() come prima istruzione.
    Non mi ricordavo e ho provato con un tentativo
    Grazie per la correzione!
    Jekkil

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.