Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [Java] Inviare dati a Mysql tramite jcombobox

    ho queste jcombobox:
    codice:
    public class DoFillCBAuthor {
    
        private int id;
        private String name;
    
        public DoFillCBAuthor(int id, String name) {
            this.id = id;
            this.name = name;
        }
    
        public int getId() {
            return id;
        }
    
        public String toString() {
            return name;
        }
    
        public static void fillAuthor() throws SQLException, ClassNotFoundException {
            Connection conn = null;
            Statement stmt = null;
            ResultSet rs = null;
            conn = DoConnection.getConnection();
            stmt = conn.createStatement();
            rs = stmt.executeQuery("SELECT * FROM author");
            while (rs.next()) {
                FramePrincipale.getComboAuthor().addItem(new DoFillCBAuthor(rs.getInt("author_id"), rs.getString("author_name")));
            }
            rs.close();
            stmt.close();
        }
    }
    nella finestra vengono visualizzati i nomi.
    però quando devo mandare la query devo fare in modo che prenda l'id.
    il metodo per l'inserimento è questo:
    codice:
    public class DoInsert {
    
        public static void insert(String name, int author_id, int editor_id, double price, String isbn, String note) throws ClassNotFoundException {
            Connection conn = null;
            Statement stmt = null;
            try {
                conn = DoConnection.getConnection();
                stmt = conn.createStatement();
                stmt.executeUpdate("INSERT book (name, author_id, editor_id, price, isbn, note) VALUES ('" + name + "', " + author_id + ", " + editor_id + ", " + price + ", '" + isbn + "', '" + note + "'");
            } catch (SQLException e) {
                JOptionPane.showMessageDialog(null, e.getMessage() + "\n" + stmt);
            } finally {
                try {
                    if (!stmt.isClosed()) {
                        stmt.close();
                    }
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(null, e.getMessage());
                }
            }
        }
    }
    i dati glieli passerei così:
    codice:
                try {
                    String name = textBookName.getText();
                    int author = comboAuthor.getSelectedIndex();
                    int editor = comboEditor.getSelectedIndex();
                    double price = Double.parseDouble(textAddPrice.getText());
                    String isbn = textIsbn.getText();
                    String note = areaNote.getText();
                    DoInsert.insert(name, author, editor, price, isbn, note);
                    textBookName.setText("");
                    comboAuthor.setSelectedIndex(0);
                    comboEditor.setSelectedIndex(0);
                    textAddPrice.setText("");
                    textIsbn.setText("");
                    areaNote.setText("");
                } catch (ClassNotFoundException ex) {
                    JOptionPane.showMessageDialog(panelContainer, ex.getMessage());
                }
    ottengo sempre errore però.
    come faccio a passargli il valore id??

  2. #2
    ho messo a posto la query ma rimane cmq un problema.
    così facendo nn invio l'id giusto ma il volaore dell'indice selezionato.
    nn c'è un modo per inviare il valore id memorizzato?

  3. #3
    ho provato a fare una cosa del genere.
    codice:
                    String name = textBookName.getText();
                    double price = Double.parseDouble(textAddPrice.getText());
                    String isbn = textIsbn.getText();
                    String note = areaNote.getText();
                    int author_id = DoSelectAuthor.leggi();
                    int editor_id = DoSelectEditor.leggi();
                    DoInsert.insert(name, author_id, editor_id, price, isbn, note);
    dove DoSelectAuthor.leggi() e DoSelectEditor.leggi() sono:
    codice:
    public class DoSelectAuthor {
    
        public static int leggi() throws ClassNotFoundException, SQLException {
            Object value = FramePrincipale.getComboAuthor().getSelectedItem();
            String name = value.toString();
            Connection conn = DoConnection.getConnection();
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM author WHERE author_name = '" + name + "'");
            rs.getInt("author_id");
            rs.close();
            stmt.close();
            return rs.getInt("author_id");
        }
    }
    //uguale per editor
    ho usato una spece di subquery.
    in pratica vorrei cercare l'id che rispecchia il nome dell'autore/editor selezionato nel combobox.
    questo id poi lo passo alla query di inserimento.
    il problema è che mi compare un JOptionPane (penso di errore) vuoto.

    qualche idea?

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    L'idea è che La JComboBox va estesa, ovvero, popolata in maniera furba con oggetti (autore, libro, ciò che ti serve) che abbiano una rappresentazione String (toString, per intenderci) utile ad essere utilizzata come etichetta dell'item della combobox ed un metodo con cui andare a leggere l'id relativo a quell'item. Se usi i getSelectedIndex ovviamente andrai a prendere la posizione nella combobox che niente ha a che vedere con l'id dell'autore/libro nel database.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    ho risolto cosi alla fine.
    nel jframe:
    codice:
                    String name = textBookName.getText();
                    double price = Double.parseDouble(textAddPrice.getText());
                    String isbn = textIsbn.getText();
                    String note = areaNote.getText();
                    Object objAuthor = comboAuthor.getSelectedItem();
                    String author_name = objAuthor.toString();
                    Object objeditor = comboEditor.getSelectedItem();
                    String editor_name = objeditor.toString();
                    DoInsert.insert(name, author_name, editor_name, price, isbn, note);
    la classe per l'inserimento:
    codice:
    public class DoInsert {
    
        public static void insert(String name, String author_name, String editor_name, double price, String isbn, String note) throws ClassNotFoundException, SQLException {
            Connection conn = null;
            Statement stmt = null;
            String author = "SELECT author_id FROM author WHERE author_name = '" + author_name + "'";
            String editor = "SELECT editor_id FROM editor WHERE editor_name = '" + editor_name + "'";
            String sql = "INSERT book (name, author_id, editor_id, price, isbn, note) VALUES ('" + name.toLowerCase() + "', (" + author + "), (" + editor + "), " + price + ", '" + isbn.toLowerCase() + "', '" + note + "')";
            try {
                conn = DoConnection.getConnection();
                stmt = conn.createStatement();
                stmt.executeUpdate(sql);
                JOptionPane.showMessageDialog(null, "Book inserted: " + sql);
            } catch (SQLException e) {
                JOptionPane.showMessageDialog(null, e.getMessage() + "\n" + sql);
            } finally {
                try {
                    if (!stmt.isClosed()) {
                        stmt.close();
                    }
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(null, e.getMessage());
                }
            }
        }
    }
    ho usato le subquery.

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    4 query al posto di 2... non è proprio il massimo, ma se non sono pressanti e ripetitive amen. Certo che a fare come ti avevo suggerito veniva di certo più pulita e orientata al risparmio di risorse (se le query dirette o le eventuali consultazioni pubbliche fossero state svariate migliaia, affogavi MySQL di lavoro inutile)
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Originariamente inviato da Andrea1979
    4 query al posto di 2... non è proprio il massimo, ma se non sono pressanti e ripetitive amen. Certo che a fare come ti avevo suggerito veniva di certo più pulita e orientata al risparmio di risorse (se le query dirette o le eventuali consultazioni pubbliche fossero state svariate migliaia, affogavi MySQL di lavoro inutile)
    si hai ragione infatti sto cercando di capire come fare seguendo il tuo consiglio.
    visto che per ora nn ci sono riuscito ho adottato questa soluzione.
    è che nn risco a capire come fare a recuperare i dati.
    cioè, la mia combobox era già popolata sia con l'id che con il nome dell'autore (più sopra ho scritto il modo in cui l'ho riempita).
    ma riesco a recuperare solo il nome e nn l'id.

  8. #8
    Originariamente inviato da fermat
    si hai ragione infatti sto cercando di capire come fare seguendo il tuo consiglio.
    visto che per ora nn ci sono riuscito ho adottato questa soluzione.
    è che nn risco a capire come fare a recuperare i dati.
    cioè, la mia combobox era già popolata sia con l'id che con il nome dell'autore (più sopra ho scritto il modo in cui l'ho riempita).
    ma riesco a recuperare solo il nome e nn l'id.
    Il concetto è questo: tu per popolare la JComboBox non usi stringhe, usi oggetti.

    Quindi se fai una query all'inizio per recuperare gli editori e gli autori, puoi memorizzare queste info con una classe (per esempio Editor e Author) che conterrà ID, Nome e tutto quello che ti serve.

    Il JComboBox come i JList, JButton ecc... accettano Object come parametri per formare la label, ed usano il metodo toString per comporre la stringa che si visualizza.
    Puoi usare lo stesso principio per il tuo JComboBox.
    Invece di passargli un array di String, gli passi un array di Author.
    Ad Author ovviamente fai l'override di toString ritornando il nome dell'autore.

    E poi quando devi recuperare l'item selezionato, getSelectedItem() ritorna Object, fai il cast ad Author e ne recuperi l'id.
    lolide
    Java Programmer

    Informati

  9. #9
    in fase di riempimento nn è più o meno una cosa del genere:
    codice:
    public class DoFillCBAuthor {
    
        private int id;
        private String name;
    
        public DoFillCBAuthor(int id, String name) {
            this.id = id;
            this.name = name;
        }
    
        public int getId() {
            return id;
        }
    
        public String toString() {
            return name;
        }
    
        public static void fillAuthor() throws SQLException, ClassNotFoundException {
            Connection conn = null;
            Statement stmt = null;
            ResultSet rs = null;
            conn = DoConnection.getConnection();
            stmt = conn.createStatement();
            rs = stmt.executeQuery("SELECT * FROM author");
            while (rs.next()) {
                FramePrincipale.getComboAuthor().addItem(new DoFillCBAuthor(rs.getInt("author_id"), rs.getString("author_name")));
            }
            rs.close();
            stmt.close();
        }
    }

  10. #10
    Purtroppo la scelta che t'ha consigliato Andrea1979 ti porterebbe a ripensare il design del tuo progetto.

    Usando quell'oggetto DoFillCBAuthor invece di un più leggero Author, rendi il tuo combobox + pesante da mantenere in memoria.

    Dovresti pensare ad una cosa del genere:

    codice:
    public class DoFillCBAuthor {
        public static void fillAuthor() throws SQLException, ClassNotFoundException {
            Connection conn = null;
            Statement stmt = null;
            ResultSet rs = null;
            conn = DoConnection.getConnection();
            stmt = conn.createStatement();
            rs = stmt.executeQuery("SELECT * FROM author");
            while (rs.next()) {
                FramePrincipale.getComboAuthor().addItem(new Author (s.getInt("author_id"), rs.getString("author_name")));
            }
            rs.close();
            stmt.close();
        }
    }
    oppure (ancora meglio pensando ad una migliore astrazione), passi un array di Author al metodo e fai provvedere ad una classe che fa operazioni sul DB a recuperare la lista degli autori.
    lolide
    Java Programmer

    Informati

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.