Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    28

    Problema con RecordSet

    Ciao a tutti,
    questo è il problema, ho creato questa classe:

    public class jcGestisciConnessione {
    private ResultSet rsRisultato = null;

    public Connection ApriConnessione() {
    Connection cnConnessione = null;
    String stDbUrl = "jdbc:mysql://gttvmlin06:3306/";
    String stDbName = "dbGestNole?zeroDateTimeBehavior=convertToNull ";
    String stDriver = "com.mysql.jdbc.Driver";
    String stUserName = "p005";
    String stPassword = "Massimo";
    try {
    Class.forName(stDriver).newInstance();
    cnConnessione = (Connection) DriverManager.getConnection(stDbUrl
    + stDbName, stUserName, stPassword);
    } catch (Exception e) {
    e.printStackTrace();
    }
    return cnConnessione;
    }

    public ResultSet SelezionaDati(String stSelect) {
    ResultSet rsRisultato = null;
    try {
    Connection conn = new jcGestisciConnessione().ApriConnessione();
    Statement stmt = (Statement) conn.createStatement();
    rsRisultato = stmt.executeQuery(stSelect);
    setRsRisultato(rsRisultato);
    stmt.close();
    conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return getRsRisultato();
    }

    public ResultSet getRsRisultato() {
    return rsRisultato;
    }

    /**
    * @param rsRisultato the rsRisultato to set
    */
    public void setRsRisultato(ResultSet rsRisultato) {
    this.rsRisultato = rsRisultato;
    }
    }

    Il fatto è che il RecordSet rsRisultato è chiuso anche se lo copio in un "set"

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    28
    Scusate... mi è scappato l'invio, continuo il discorso

    In pratica dopo la chiusura di statement e connessione mi ritrovo con il RecordSet chiuso
    e non posso accedere ai dati. Esiste un modo per evitarlo ?
    Grazie
    Massimo

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    accedi ai dati, solo quando li hai presi tutti chiudi prima resultSet, poi statament e infine connessione (se vuoi le cose fatte bene)
    RTFM Read That F*** Manual!!!

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    28
    Il mio intento sarebbe: salvare i dati in una struttura "sicura", chiudere statement e connessione e poi trattarli. Visto che devo fare elaborazioni complesse mi sarebbe più comodo.
    Massimo

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    la chiusura della connessione e dello statement comunque comporta la chiusura del result set, quindi non hai alternative

    edit:

    questo te lo dice chiaramente la javadoc
    RTFM Read That F*** Manual!!!

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    28
    Li ho letti e ho capito benissimo, ho provato a copiare il ResultSet su una struttura RowSet ma devo fare il cast e non me lo lascia fare, così come con CachedRowSet.
    Visto che devo fare della reportistica molto complessa prendendo i dati anche da più query
    non esiste un modo per copiare questo ResultSet su una struttura "sganciata" dalla chiusura del medesimo ?
    Ora il metodo SelezionaDati è così:

    public ResultSet SelezionaDati(String stSelect) throws SQLException {
    ResultSet rsRisultato = null;
    Statement stStatement = null;
    Connection cnConnessione = null;
    try {
    cnConnessione = new jcGestisciConnessione().ApriConnessione();
    stStatement = (Statement) cnConnessione.createStatement();
    rsRisultato = stStatement.executeQuery(stSelect);
    } catch (SQLException e) {
    e.printStackTrace();
    } finally {
    if (rsRisultato != null) {
    try {
    setRsRisultato(rsRisultato);
    rsRisultato.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    if (stStatement != null) {
    try {
    stStatement.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    if (cnConnessione != null) {
    try {
    cnConnessione.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }
    return getRsRisultato();
    }

    L'eccezione è sempre la stessa: "java.sql.SQLException: Operation not allowed after ResultSet closed".
    Devo fare diversi metodi, uno per ogni query, ripetendo n-volte tutto questo ambaradan ?

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    al massimo potresti clonare il resultSet in uno sganciato dalla connessione, ma in realtà la clonazione per questo oggetto non è prevista e non ha nemmeno tanto senso (visto che è il risultato di una query).

    Puoi anche castare ad un'altra classe, il punto è che erediti da ResultSet e questo è legato allo statement.
    Che io sappia non esiste modo di creare uno statement e lavorarci offline.

    Puoi provare a scrivere la query in modo diverso, sfruttando join e condizioni, in questo caso prova prima direttamente sul db.

    Infine puoi usare preparedStatement, in modo da non dover ricompilare la query ogni volta. Ma ricorda che preparedStatement si comporta come statement a livello di chiusura
    RTFM Read That F*** Manual!!!

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    28
    E se fosse passarlo in una struttura List o ArrayList ?
    Magari con un ciclo while... se c'è un modo per accodare i record senza specificare
    campo per campo sarebbe perfetto.

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    e siamo punto e a capo: per crearti una struttura temporanea tipo una list devi scorrerti il resultset e questo lo fai mentre lo statement è ancora attivo, poi puoi lavorare sulla tua copia locale e te ne freghi di quello che c'è su db.
    Ma tra l'istante della query e quello in cui hai creato la lista scorrendo il result set non puoi chiudere niente
    RTFM Read That F*** Manual!!!

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    28
    Bè sì... pero ho il mio blocco di records e ci posso lavorare tranquillamente.
    Una domanda, ho visto anche queste opzioni per lo statement:

    CLOSE_CURSORS_AT_COMMIT
    CONCUR_READ_ONLY
    CONCUR_UPDATABLE
    FETCH_FORWARD
    FETCH_REVERSE
    FETCH_UNKNOWN
    HOLD_CURSORS_OVER_COMMIT
    TYPE_FORWARD_ONLY
    TYPE_SCROLL_INSENSITIVE
    TYPE_SCROLL_SENSITIVE

    ma non mi è chiaro il loro utilizzo, possono servirmi ?

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.