Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    [Java] Inserimento dati in un DB

    Nel mio programma ho una jlist.
    Una parte del codice è il seguente:
    codice:
            menuList.setModel(new javax.swing.AbstractListModel() {
                String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
                public int getSize() { return strings.length; }
                public Object getElementAt(int i) { return strings[i]; }
            });
            jScrollPane1.setViewportView(menuList);
    Al posto di Item 1 etc. all'apertura della finestra deve visualizzarmi il contenuto di una elenco di dati presenti nel database (un solo campo, la categoria) e quando clicco su una riga deve visualizzarmene i dati in una finestra lì a fianco.
    Come si fa questa cosa? Se avete anche esempi di codice sono ben accetti.
    Grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Sono riuscita a fare il primo passo, l'inserimento dei dati presi dal db nella Jlist.
    Non riesco a inserire i dati nel db presi da un campo jText inserito dall'utente.
    Ho fatto così:
    codice:
        public static void insertMenu(String field) {
            try {
                st = connection.createStatement();
                st.executeUpdate("INSERT INTO Menu (field) VALUES (NULL,?)");
            } catch (SQLException e) {
                JOptionPane.showMessageDialog(null, "Si è verificato un problema\nnell'inserimento dei dati!", "Errore!", JOptionPane.WARNING_MESSAGE);
                Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE, null, e);
            }
        }
    dove field è il nome del campo jText da cui gli passo i dati
    ma mi da errore di sintassi sql...
    Grazie!

    EDIT: Ho risolto, era un problema di sintassi, quella giusta è:
    st.executeUpdate("INSERT INTO Menu VALUES (NULL,'"+field+"')");

    Problema: dopo che premo il pulsante salva inserisce il dato nel database però il campo rimane attivo e non succede niente (ovviamente, visto che non ho ancora implementato questa parte).
    Adesso dovrei fare in modo che alla pressione di 'salva' se l'inserimento è avvenuto con successo il campo deve tornare non editabile e si deve aggiornare la jlist laterale col nuovo campo inserito...suggerimenti?
    Ultima modifica di Jamie04; 19-03-2014 a 20:37

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio

    EDIT: Ho risolto, era un problema di sintassi, quella giusta è:
    st.executeUpdate("INSERT INTO Menu VALUES (NULL,'"+field+"')");
    Cosa succede se field contiene -ad esempio- un apostrofo?

    Avresti dovuto usare uno PreparedStatement...

    http://docs.oracle.com/javase/tutori.../prepared.html
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    Cosa succede se field contiene -ad esempio- un apostrofo?

    Avresti dovuto usare uno PreparedStatement...

    http://docs.oracle.com/javase/tutori.../prepared.html
    infatti ho provato a inserire solo un ' e mi dà un sql error di sintassi...
    grazie
    non avevo ben chiaro il funzionamento dei preparedstatement e adesso mi hai dato un motivo per usarli.
    ma come devo modificare ora il codice?
    per la faccenda dei bottoni ho risolto.

  5. #5
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Hai aperto il link che ti ho fornito?
    Ci sono degli esempi piuttosto chiari...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    Hai aperto il link che ti ho fornito?
    Ci sono degli esempi piuttosto chiari...

    Sì sì ma non avevo capito molto bene, nel frattempo credo di aver risolto, almeno funziona:

    codice:
        public static void insertMenu(String field) {
            try {
                if (field.isEmpty()) {
                    JOptionPane.showMessageDialog(null, "Non puoi inserire un menu senza nome!", "Errore!", JOptionPane.WARNING_MESSAGE);
                    return;
                }
                PreparedStatement pst=null;
                String query="INSERT INTO Menu VALUES (NULL, ?)";
                pst = connection.prepareStatement(query);
                pst.setString(1,field);
                int executeUpdate = pst.executeUpdate();
            } catch (SQLException e) {
                JOptionPane.showMessageDialog(null, "Si è verificato un problema\nnell'inserimento dei dati!", "Errore!", JOptionPane.WARNING_MESSAGE);
                Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE, null, e);
            }
        }
    Che ne pensi di questo metodo?

    Inoltre mi sono accorta che se cancello dei record e poi ne inserisco di nuovi l'ID (che ho definito con AUTO_INCREMENT) dei nuovi inseriti si incrementa di 1 ma partendo sempre dai valori che ho cancellato e non dagli ultimi rimasti. Come posso fare in modo che se cancello un record il prossimo che inserisco abbia l'id del record cancellato?
    Ultima modifica di Jamie04; 19-03-2014 a 23:32

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Che ne pensi di questo metodo?
    E' un po' sporco e poco leggibile ma è corretto. Ah, non hai chiuso lo statement (in modo da liberare risorse)

    Non mi piace la gestione delle eccezioni

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Inoltre mi sono accorta che se cancello dei record e poi ne inserisco di nuovi l'ID (che ho definito con AUTO_INCREMENT) dei nuovi inseriti si incrementa di 1 ma partendo sempre dai valori che ho cancellato e non dagli ultimi rimasti. Come posso fare in modo che se cancello un record il prossimo che inserisco abbia l'id del record cancellato?
    Allora togli AUTO_INCREMENT e gesti a mano l'incremento dell'ID. Ma detto francamente... ti turba avere dei "buchi" tra gli ID? L'id dovrebbe essere univoco... non ha senso riassegnare quelli di elementi cancellati...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    E' un po' sporco e poco leggibile ma è corretto. Ah, non hai chiuso lo statement (in modo da liberare risorse)
    "Sporco e poco leggibile", perché? Se ti va di spiegarmelo.
    Perché non ti piace la gestione delle eccezioni?


    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    Allora togli AUTO_INCREMENT e gesti a mano l'incremento dell'ID. Ma detto francamente... ti turba avere dei "buchi" tra gli ID? L'id dovrebbe essere univoco... non ha senso riassegnare quelli di elementi cancellati...
    sì in effetti è un falso problema, mi era solo saltato all'occhio, credevo che un id liberato venisse riassegnato.

  9. #9
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    "Sporco e poco leggibile", perché? Se ti va di spiegarmelo.
    - Il codice è tutto ammassato, non ci sono righe vuote che separano le varie operazioni. Ad esempio, hai codice di controllo e operazioni vere e proprie troppo amalgamate. Questo rende difficile capire a colpo d'occhio cosa stai facendo
    - Usi variabili inutili, ad esempio per la query: passa direttamente al prepareStatement, no?

    Sì, sono talebano su 'ste cose


    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Perché non ti piace la gestione delle eccezioni?
    Non c'è il finally: in caso di eccezione lo statement resta aperto, andando a occupare inutilmente risorse.

    Il problema più grave IMHO è che in caso di eccezione stai facendo <i>troppo</i>: insertMenu dovrebbe fare una query, e basta. Te gli stai dando la responsabilità di avvisare l'utente che qualcosa è andato storto. Questa gestione andarebbe fatta a livello più alto: cosa succede se insertMenu facesse parte di una libreria che distribuisci ad altri sviluppatori? Potrebbe essere usata in un contesto in cui l'interfaccia grafica neanche esiste (pensa ad un batch notturno che legge dei dati da file e inserisce tutto a db, senza l'intervento dell'operatore). insertMenu() dovrebbe limitarsi a lanciare l'eccezione: sarà chi lo chiama a decidere cosa fare: avverto l'utente? Scrivo in un file di log? Mando una email al responsabile?

    Spero di essere stato chiaro ^^


    Io avrei fatto una cosa del genere, delegando la gestione a chi chiama il metodo:



    codice:
        public static void insertMenu(String field) throws SQLException, IllegalArgumentException {
            PreparedStatement statement = null;
    
            try {
                if (field == null || field.isEmpty()) {
                    throw new IllegalArgumentException("Please provide a not-null and not-empty value for 'field'");
                }
    
                statement = connection.prepareStatement("INSERT INTO Menu VALUES (NULL, ?)");
                statement.setString(1, field);
                statement.executeUpdate();
            } finally {
                if (statement != null) {
                    statement.close();
                }
            }
        }


    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    sì in effetti è un falso problema, mi era solo saltato all'occhio, credevo che un id liberato venisse riassegnato.
    Sarebbe un problema se venisse riassegnato visto che in genere un auto_increment è usato (purtroppo) come primary key...



    Ah, anche il fatto che sia static non mi piace ma bisognerebbe vedere un attimo come hai organizzato l'architettura dell'applicazione.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  10. #10
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio

    Sarebbe un problema se venisse riassegnato visto che in genere un auto_increment è usato (purtroppo) come primary key...
    Non capisco perché purtroppo...so bene che ogni tanto viene abusato...ma altre volte (la maggior parte IMHO) è un dato che ti "salva"
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

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.