Ritornare stringa dopo interrogazione db

di il
7 risposte

Ritornare stringa dopo interrogazione db

Salve ho implementato un metodo(errato):
/**
	 * Ritorna l'id della collezione sapendo il sesso e il nome
	 * @param nome
	 */
	public String getIdCollezioneByNomeSesso(String nome, String sesso) {
		ResultSet result;
		
		String query = "select \"IDCollezione\" from\"Negoziodiabbigliamento\".\"Collezione\" where \"Nome\"=? and \"Sesso\"=? ";
		try {
			PreparedStatement pst = con.prepareStatement(query);
			result = pst.executeQuery();
			pst.setString(1, nome);
			pst.setString(2, sesso);
				return result;
			
		} catch (SQLException e) {e.printStackTrace(); return null;}

	}
Tale metodo mi preleva dalla tabella l'idcollezione corrispondente di un determinato nome e sesso.
La mia difficoltà essendo neofita è capire cosa mettere nel return. Devo passare il valore in un'ulteriore variabile?

7 Risposte

  • Re: Ritornare stringa dopo interrogazione db

    indisparte ha scritto:


    Tale metodo mi preleva dalla tabella l'idcollezione corrispondente di un determinato nome e sesso.
    La mia difficoltà essendo neofita è capire cosa mettere nel return. Devo passare il valore in un'ulteriore variabile?
    Beh, il codice è un po' scombinato. Prima devi fare con.prepareStatement, POI fare i pst.setString e POI il pst.executeQuery.
    Quindi ottieni un ResultSet. Quante righe di aspetti? Una sola? O N ma a te interessa solo la prima?

    Se ti basta solo una sola:
    if (result.next()) {
        /*prendi la colonna*/
    }
    Nota: if invece del while tipico, se ti basta 1 sola riga.
    Quindi estrai la colonna e ... restituisci.
    Chiaramente è da fare tutto in modo "pulito", devi chiudere correttamente ResultSet e PreparedStatement.


    P.S. ragiona BENE sul numero di righe.
  • Re: Ritornare stringa dopo interrogazione db

    andbin ha scritto:


    indisparte ha scritto:


    Tale metodo mi preleva dalla tabella l'idcollezione corrispondente di un determinato nome e sesso.
    La mia difficoltà essendo neofita è capire cosa mettere nel return. Devo passare il valore in un'ulteriore variabile?
    Beh, il codice è un po' scombinato. Prima devi fare con.prepareStatement, POI fare i pst.setString e POI il pst.executeQuery.
    Quindi ottieni un ResultSet. Quante righe di aspetti? Una sola? O N ma a te interessa solo la prima?

    Se ti basta solo una sola:
    if (result.next()) {
        /*prendi la colonna*/
    }
    Nota: if invece del while tipico, se ti basta 1 sola riga.
    Quindi estrai la colonna e ... restituisci.
    Chiaramente è da fare tutto in modo "pulito", devi chiudere correttamente ResultSet e PreparedStatement.


    P.S. ragiona BENE sul numero di righe.
    public String getIdCollezioneByNomeSesso(String nome, String sesso) {
    		ResultSet result;
    		
    		String query = "select \"IDCollezione\" from\"Negoziodiabbigliamento\".\"Collezione\" where \"Nome\"=? and \"Sesso\"=? ";
    		try {
    			PreparedStatement pst = con.prepareStatement(query);
    			pst.setString(1, nome);
    			pst.setString(2, sesso);
    			result = pst.executeQuery();
    			String idCollezione = result.getString("IDCollezione");//controllare veridicità
    			return idCollezione;
    			
    		} catch (SQLException e) {e.printStackTrace(); return null;}
    
    	}
    Così invece? mi serve solo un dato perchè nella tabella il del db l'idcollezione è unico per nome e sesso
  • Re: Ritornare stringa dopo interrogazione db

    indisparte ha scritto:


    Così invece?
    No, il next() lo devi comunque fare almeno UNA volta! JDBC funziona così, non puoi prendere subito una colonna così ...

    indisparte ha scritto:


    mi serve solo un dato perchè nella tabella il del db l'idcollezione è unico per nome e sesso
    Sì ma potresti avere 4 "Andrea" di sesso maschile ... no? E allora? Che fai? Ne prendi uno "a caso" ... ?
  • Re: Ritornare stringa dopo interrogazione db

    andbin ha scritto:


    indisparte ha scritto:


    Così invece?
    No, il next() lo devi comunque fare almeno UNA volta! JDBC funziona così, non puoi prendere subito una colonna così ...

    indisparte ha scritto:


    mi serve solo un dato perchè nella tabella il del db l'idcollezione è unico per nome e sesso
    Sì ma potresti avere 4 "Andrea" di sesso maschile ... no? E allora? Che fai? Ne prendi uno "a caso" ... ?
    No ti spiego la tabella creata racchiude le collezioni di vestiti. ad esempio Pantalone maschile avrà come id PM oppure pantalone femminile PF. Ascolta non ho ben capito come dovrei usare il next, potresti mostrarmelo sul mio codice?
  • Re: Ritornare stringa dopo interrogazione db

    indisparte ha scritto:


    No ti spiego la tabella creata racchiude le collezioni di vestiti. ad esempio Pantalone maschile avrà come id PM oppure pantalone femminile PF.
    Oh ... pensavo fossero nomi di persona ..
    Ok ok, allora HA senso, presumo (ora ho capito meglio) non ci siano quindi duplicazioni sulla combinazione nome+sesso.

    indisparte ha scritto:


    Ascolta non ho ben capito come dovrei usare il next, potresti mostrarmelo sul mio codice?
    L'ho detto già prima:
    if (result.next()) {
        // ...qui estrai la colonna del primo/unico record
    } else {
        // ...record non trovato .... decidi tu ...
    }
    E se non trovassi il record? Tecnicamente hai almeno 2 opzioni sensate: a) restituisci null; b) lanci una eccezione.
  • Re: Ritornare stringa dopo interrogazione db

    Grazie mille!!!
  • Re: Ritornare stringa dopo interrogazione db

    Giusto per darti una idea di come si realizza in modo accurato, questo è quanto farei io:
    public String getIdCollezioneByNomeSesso(String nome, String sesso) throws SQLException {
        String query = "SELECT \"IDCollezione\" "
                     + "FROM \"Negoziodiabbigliamento\".\"Collezione\" "
                     + "WHERE \"Nome\" = ? AND \"Sesso\" = ?";
    
        PreparedStatement pst = con.prepareStatement(query);
    
        try {
            pst.setString(1, nome);
            pst.setString(2, sesso);
    
            ResultSet rs = pst.executeQuery();
    
            try {
                if (rs.next()) {
                    return rs.getString("IDCollezione");
                } else {
                    return null;  // non trovato
                }
            } finally {
                rs.close();
            }
        } finally {
            pst.close();
        }
    }

    Nota che io ho scelto di far uscire fuori SQLException, come vedi NON c'è un catch lì dentro. È una scelta e se ne possono fare altre ...
    Anche riguardo ai close. Nel senso che anche il close() potrebbe lanciare eccezione. Quindi si potrebbero fare dei metodi di utilità che fanno il close "mangiandosi" l'eccezione.
Devi accedere o registrarti per scrivere nel forum
7 risposte