Visualizzazione dei risultati da 1 a 3 su 3

Discussione: problema resultSet

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2013
    Messaggi
    53

    problema resultSet

    salve,

    ho un problema non riesco a capire come mai questo resultset non mi da la riga del database
    il codice è questo
    codice:
     String selectSQL = "SELECT * FROM prodotti WHERE matricola = ' " + matricola + " ' or categoria = ' " + categoria + " ' ";//stringa che rappresenta il comando sql di selezione dei dati da estrarre        
     Vector<Object> row = new Vector<>();//per l'acquisizione di una singola riga 
            Vector<Vector<Object>> rows = new Vector<>();//per tutte le righe cercate             
            st = DialogPassword.getConnessioneDb().createStatement();//creo l'oggetto statement
            select = st.executeQuery(selectSQL);//creo select passandogli il metodo executeQuery 
            //finchè ci sono righe con elementi le acquisisce in row
            while(select.next())
            {           
                row.add(select.getString("matricola"));
                row.add(select.getString("categoria"));
                row.add(select.getString("titolo"));
                row.add(select.getString("descrizione"));
                row.add(select.getFloat("prezzo"));
                row.add(select.getInt("quantita"));
                row.add(select.getString("dati_tecnici"));
                row.add(select.getString("impiego"));
                //inserisci la riga in rows
                rows.add(row);               
             }                
            return rows;//ritorna il vettore con le righe aggiunte
    il problema è che cosi non ho nessun tipo di errore però non mi da nessuna riga........qualcuno ha qualche consiglio?

    ps lo scopo sarebbe di farmi restituire il Vector<Vector con le righe selezionate e poi popolare un JTable(vector<Vector, Vector nomiColonne)
    ma non succede niente

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Considerazioni:

    1) Mai creare le istruzioni SQL in quel modo, soprattutto se vi sono clausole WHERE. Si dovrebbero usare i PreparedStatement, per evitare che la stringa SQL ne risulti mal formata a causa di caratteri particolari eventualmente contenuti nelle variabili stringa o a causa dei formati per le date, o a causa di errori poco visibili, ecc.... e questo è quasi certamente il motivo per cui non viene estratto nulla dal tuo DB (vedi più avanti il perchè).

    2) Usare dei Vector di Vector mi fa tanta, ma tanta paura... io userei delle strutture dati diverse. Un ArrayList<String[]> se proprio non voglio essere per nulla Object Oriented, altrimenti modellerei una classe che mi rappresenta l'informazione del record e userei un ArrayList di questi oggetti

    3) Dentro al ciclo while() stai commettendo il tipico errore di "riutilizzare" lo stesso oggetto... in questo modo il Vector conterrà tanti riferimenti all'ultimo record eventualmente estratto dalla query, perdendo tutti gli altri. L'oggetto "row" va ricreato (con la new) per ogni ciclo del while... meglio se è addirittura dichiarato dentro al while stesso e non fuori, per motivi legati al GC.


    Non vedo il trattamento delle eccezioni, quindi mi fido di quel che dici (ovvero: non ci sono eccezioni). Fatti stampare la stringa SQL che verrà eseguita e prova ad eseguirla "a mano" direttamente sul DB. Secondo me è sbagliata quel'istruzione SQL, infatti ci sono degli spazi tra l'apice ed il valore (cosa che avresti evitato se avessi, appunto, usato i PreparedStatement). Vedi qui sotto quello che viene costruito:


    codice:
    String matricola = "123";
    String categoria = "abc";
    
    // Stringa SQL risultante (osserva gli spazi dentro agli apici)
    SELECT * FROM prodotti WHERE matricola = ' 123 ' or categoria = ' abc ';
    
    // Forse tu volevi ottenere questa, che è ben diversa
    SELECT * FROM prodotti WHERE matricola = '123' or categoria = 'abc';

    Se si usano i PreparedStatement, è tutto molto più semplice e si delega al driver JDBC l'onere di fare le cose come si deve:


    codice:
    String sql = "SELECT * FROM prodotti WHERE matricola = ? or categoria = ?";
    PreparedStatement pstmt = con.prepareStatement( sql );
    pstmt.setString(1, matricola);
    pstmt.setString(2, categoria);
    
    ...

    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

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2013
    Messaggi
    53
    grazie mille mi sei stato di grande aiuto

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.