Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    SQLException che non capisco

    Salve, ho realizzato un semplice gestionale per edicole in Java, evoluzione di una precedente versione che lavorava su un ArrayList perdendo di conseguenza i dati chiudendo l'applicazione. Ora i dati sono salvati in un database tramite connettore JDBC.
    Da vari test fatti il programma funziona perfettamente, tranne per un fatto: intervenendo sull'UPDATE delle copie vendute, l'operazione va in porto ma il catch intercetta una
    java.sql.SQLException: Operation not allowed after ResultSet closed
    Ho indagato un po' sul ResultSet ma senza trovare riscontri di quel messaggio. Pubblico di seguito in codice in questione (la parte relativa all'eccezione, le connessioni al db vengono aperte per inviare le query SQL e ricevere i dati e poi prontamente chiusi, pertanto non dovrebbero esserci influenze di altre parti del programma.
    codice:
                   String query = "SELECT cricevute, cvendute FROM quotidiani WHERE id='" + id + "'";                    
                    try {
                        Class.forName("com.mysql.cj.jdbc.Driver");
                        Connection conn = DriverManager.getConnection(url, "root", "");
                        Statement stmt = conn.createStatement();
                        ResultSet res = stmt.executeQuery(query);
                            
                        while (res.next()) {
                            int ricevute = res.getInt("cricevute");
                            int vendute = res.getInt("cvendute");
                            vendute++;
    
    
                            if (vendute < ricevute) {
                                result = stmt.executeUpdate("UPDATE quotidiani set cvendute='" + vendute + "' where id='" + id + "'");
    
    
                                if (result > 0) {
                                    System.out.println("Copie vendute aggiornate correttamente");
                                } else {
                                    System.out.println("Aggiornamento fallito");
                                }
    
    
                            } else {
                                System.out.println("Copie esaurite");
                            }
    
    
                        }
                        conn.close();
                    }
                    catch (SQLException e) {
                        System.out.println(e);
                    }
    Vorrei capire cosa genera l'eccezione, dopo la stampa della quale il programma prosegue indisturbato.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    codice:
                        Statement stmt = conn.createStatement();
                        ResultSet res = stmt.executeQuery(query);
                            
                        while (res.next()) {
    
    
                                result = stmt.executeUpdate("UPDATE quotidiani set cvendute='" + vendute + "' where id='" + id + "'");
    
                        }
    Innanzitutto i close() andrebbero sempre fatti, ovvero in pratica si deve utilizzare il try-finally.

    Ma il problema è ancora un altro (come hai descritto) ed ha una spiegazione molto semplice: hai creato 1 solo oggetto Statement e su quello stesso oggetto Statement hai eseguito 2 query distinte.

    La documentazione javadoc di Statement lo dice chiaramente:

    By default, only one ResultSet object per Statement object can be open at the same time. Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects. All execution methods in the Statement interface implicitly close a current ResultSet object of the statement if an open one exists.

    Eseguendo la seconda query di update, hai chiuso implicitamente il Result della prima query. È così che funziona ... è la regola.

    Pertanto, non è così che puoi fare due query, una "annidata" nell'altra. Servono due Statement distinti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

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.