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

    [JAVA] Lettura intero contenuto tabella database

    Buongiorno.
    Devo creare un metodo che mi legga l'intero contenuto di una tabella di un database. Il database dell'esercizio è così formato:
    (Matricola chiave primaria, Nome, Cognome, Timbrature)

    Il metodo che ho scritto è questo

    codice:
    public void printAll() throws ClassNotFoundException, SQLException{		Ricerca search = new Ricerca();
    		
    		UserInterface ui = new UserInterface();
    		Connection con = null;
    		Statement stmt = null;
    		ResultSet rs = null;
    		int matricola = 0, righe = 0;
    		try {
    			Class.forName(CLASS_NAME);
    			con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
    			String sql = "SELECT * FROM utenti";
    			stmt = con.createStatement();
    			rs = stmt.executeQuery(sql);
    			rs.last();
    			righe = rs.getRow();
    			rs.beforeFirst();
    			for (int i = 0; i < righe; i++){
    				while (rs.nextRow()){
    					Utente user = new Utente();
    					matricola = rs.getInt(4);
    					user = search.cercaUtente(matricola);
    					ui.stampaUtente(user);
    				}
    			}
    		} finally{
    			rs.close();
    			stmt.close();
    			con.close();
    		}
    	}
    Che a sua volta richiama il metodo cercaUtente che è quello qui sotto

    codice:
    public Utente cercaUtente(int matricola) throws ClassNotFoundException, SQLException {		Connection con = null;
    		Statement stmt = null;
    		Utente utente = new Utente();
    		try {
    			Class.forName(CLASS_NAME);
    			con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
    			stmt = con.createStatement();
    			ResultSet rs = stmt.executeQuery("SELECT * FROM utenti WHERE matricola = " + matricola);
    			while (rs.next()) {
    				utente.setMatricola(rs.getInt(1));
    				utente.setNome(rs.getString(2));
    				utente.setCognome(rs.getString(3));
    				utente.setTimbrature(rs.getInt(4));
    			}
    		} finally {
    			stmt.close();
    			con.close();
    		}
    		return utente;
    	}
    Il metodo cercaUtente restituisce una istanza della classe Utente che ha gli stessi attributi presenti nella tabella del database.

    Attualmente, dopo i vari esperimenti di inserimento e cancellazione, la tabella ha sei righe, il programma me le stampa tutte e sei, ma hanno tutti i valori settati a null.

    Utente [matricola=0, nome=null, cognome=null, timbrature=0]
    Utente [matricola=0, nome=null, cognome=null, timbrature=0]
    Utente [matricola=0, nome=null, cognome=null, timbrature=0]
    Utente [matricola=0, nome=null, cognome=null, timbrature=0]
    Utente [matricola=0, nome=null, cognome=null, timbrature=0]
    Utente [matricola=0, nome=null, cognome=null, timbrature=0]

    Perchè mi accade questo? Cosa ho cannato nel codice?

    Ringrazio in anticipo chi mi aiuterà!

  2. #2
    Ho dimenticato di specificare che il metodo cercaUtente funziona a dovere se l'utente da cercare e poi stampare è uno solo (ovvero usando la parte di codice che mi permette di stampare un solo utente in base alla matricola)

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Premesso che bisognerebbe anche vedere cosa fa il metodo stampaUtente(), il motivo potrebbe essere dovuto a

    1) Il fatto che entrambe le query leggono dalla stessa tabella (forse hai sbagliato a scrivere la prima query)
    2) quell'inutile (inutile da quel che si può vedere) spostamente sull'ultima riga per recuperare il numero di righe di cui poi non ti fai nulla, per poi ritornare all'inizio. Se il RecordSet prodotto non è navigabile in entrambe le direzioni e/o se il driver sottostante si comporta male potresti avere di questi brutti effetti.
    Il consiglio: scorri tutte le righe e, man mano, se serve, le conti, senza fare spostamenti su e giù per il recordset.

    Poi le note dolenti:

    1) Il driver va caricato UNA ed UNA SOLA volta, magari all'inizio e non ogni volta che devi fare una query... una volta caricato, è già a disposizione per tutta la durata della tua applicazione.

    2) La connessione al DB andrebbe fatta UNA ed UNA SOLA volta ed eventualmente passata ovunque ce ne sia bisogno, altrimenti a lungo andare ammazzi il DBMS

    3) Dal punto precedente deriva che non devi chiudere la connessione al DB ogni volta che effettui una query: la chiudi quando non ti serve più il DB.

    4) Sarebbe preferibile non creare le query usando la concatenazione dei valori da passare, ma usare le PreparedStatements con tutti i vantaggi del caso (e non sono pochi): questo perchè DBMS diversi usano regole sintattiche diverse per molte cose (date, numeri, ecc).

    5) Dentro al while "principale" (quello in cui scorri tutti i record della tabella utenti, ma che forse non doveva essere la tabella utenti), crei inutilmente un oggetto Utente, che poi andrà buttato via non appena gli assegni il risultato della chiamata al metodo cercaUtente()... non ha molto senso.



    Ciao.
    Ultima modifica di LeleFT; 15-10-2015 a 18:00
    "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
    public void stampaUtente(Utente user) {
    System.out.println (user)
    }

    Utilizzando il metodo toString che ho sovrascritto per la classe Utente in modo che mi stampasse l'utente nel modo che ti ho fatto vedere sopra
    Utente [matricola=0, nome=null, cognome=null, timbrature=0]

  5. #5
    Intanto grazie per l'aiuto.
    SOno riuscito a migliorare le cose riguardanti i consigli che mi hai dato.

    Per quanto riguarda invece il problema che avevo nella fattispecie, banalissimamente, sono stato sbadato io a mettere l'indice sbagliato in rs.getInt. Avevo messo 4, come nel codice sopra, mentre in realtà dovevo mettere 1 e così funziona benissimo!

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.