salve ragazzi, vi sottopongo il mio problema.
Devo fare inserimento, modifica e cancellazione dei dati da una form swing verso un database access.
In pratica io ho fatto una tabella in access dove inserisco Titolo, Autore e Dimensione.
Mi funziona tutto a patto che il titolo sia una stringa, l'autore sia una stringa e la dimensione che deve essere un intero, sia una stringa.
Quindi il concetto è che se nel database ho questi tre campi in formato testo e dall'interfaccia gli passo stringhe, allora funziona tutto; io però trovo più sensato che il campo dimensione, che deve contenere un intero, sia di tipo numerico, solo che se il campo "dimensione" nel database lo faccio diventare numerico e dico che dall'interfaccia il campo "dimensione" deve raccogliere un valore intero invece di una stringa, ecco che mi compaiono un pò di errori.
vi posto il codice che mi crea problemi con il campo "dimensione" che diventa di tipo intero:
Nel database ci sta una Tabella PRODOTTO che contiene Titolo(testo),Autore(testo),Dimensione(numerico)
Questa è la classe VoceDistributore con le info.
La parte grafica la gestisce la classe GUIDistributore di cui vi posto il metodo actionPerformed che gestisce la pressione dei pulsanti sull'interfaccia.codice:public class VoceDistributore { private String titolo; private String autore; private int dimensione; public VoceDistributore(String titolo, String autore,int dimensione) { this.titolo=titolo; this.autore=autore; this.dimensione=dimensione; } public String getTitolo() { return titolo; } public String getAutore() { return autore; } public int getDimensione() { return dimensione; } public String toString() { return "TIT: "+titolo+" AUT: "+autore+" DIM: "+dimensione; } }
Questa invece è la classe DistributoreDB che raccoglie i dati sopra e mi fa le interrogazioni sul database accesscodice:public void actionPerformed(ActionEvent ae) { Object o=ae.getSource(); if (o instanceof JButton) { if (o==inserisci) { VoceDistributore v=new VoceDistributore(titolo.getText(),autore.getText(),dimensione.getText());//questi sono tutti campi di testo di un //pannello di una JTabbedPane che si chiama inserisci try{ mt.inserisci(v); //mando i valori alla classe che si chiama DistributoreDB che mi fa le query titolo.setText(""); autore.setText(""); dimensione.setText(""); } catch(VoceAssente e){ JOptionPane.showMessageDialog(null,"Devi riempire i campi obbligatori", "Attenzione",JOptionPane.ERROR_MESSAGE); } } else if (o==modifica) { VoceDistributore v=new VoceDistributore(titolo2.getText(),autore2.getText(),dimensione2.getText());//questi sono tutti campi //di testo di un pannello di una JTabbedPane che si chiama modifica try { mt.modifica(voceSelezionata,v);//il metodo voce selezionata viene mostrato più in basso, serve per selezionare una //voce di una JList chiamata elenco, che mi fa ricomparire i dati nel pannello modifica nelle caselle di testo(Titolo,Autore,Dimensione) } catch (VoceAssente e) { JOptionPane.showMessageDialog(null,"Voce non presente nel database", "Operazione fallita",JOptionPane.ERROR_MESSAGE); } } else if (o==cancella) { try { mt.cancella(voceSelezionata);//stessa cosa di sopra } catch (VoceAssente e) { JOptionPane.showMessageDialog(null,"Voce non presente nel database", "Operazione fallita",JOptionPane.ERROR_MESSAGE); } } } } public void valueChanged(ListSelectionEvent e) {//metodo che mi gestisce la selezione di una voce selezionata nella JList "elenco" int i=elenco.getSelectedIndex(); if (i<0 || i>= voci.length) voceSelezionata=null; else voceSelezionata= voci[i]; if (voceSelezionata!=null) { titolo2.setText(voceSelezionata.getTitolo()); autore2.setText(voceSelezionata.getAutore()); dimensione2.setText(voceSelezionata.getDimensione());//qui mi da errore e mi dice che non posso usare il setText per scrivere interi //nelle caselle di testo setEnabledAt(2,true); } else { titolo2.setText(""); autore2.setText(""); dimensione2.setText(""); setEnabledAt(2,false); } }
ps il succo è che se imposto "dimensione" di tipo String e nel database ci metto che il campo "dimensione" deve essere testo, allora funziona tutto.codice:public void inserisci(VoceDistributore v) throws VoceAssente{ String query="INSERT INTO PRODOTTO (TITOLO, AUTORE,DIMENSIONE) VALUES (" +"'"+v.getTitolo()+"', "+"'"+v.getAutore()+"', "+"'"+v.getDimensione()+"'"+");"; Statement s=null; try { //qui ho fatto semplicemente un controllo che i campi vengano inseriti obbligatoriamente, solo che //v.getDimensione().equalsIgnoreCase("") quando si trattava di Stringhe funzionava, invece adesso no. if (v.getTitolo().equalsIgnoreCase("") || v.getAutore().equalsIgnoreCase("") || v.getNome_file().equalsIgnoreCase("") || v.getDimensione().equalsIgnoreCase("")) throw new VoceAssente(); s=c.createStatement(); s.executeUpdate(query); } catch (SQLException e) { if(e.getErrorCode()==0){ JOptionPane.showMessageDialog(null,"Oggetto già presente nel database", "Operazione fallita",JOptionPane.ERROR_MESSAGE); }else { visualizzaEccezioneSQL(e); }} finally { try { if (s!=null) s.close (); } catch (SQLException e) { visualizzaEccezioneSQL(e); } } } public void cancella(VoceDistributore v)throws VoceAssente { String query="DELETE FROM PRODOTTO WHERE TITOLO = '" +v.getTitolo()+"' AND AUTORE = '"+v.getAutore()+"' AND DIMENSIONE= '"+v.getDimensione()+"';"; Statement s=null; try { s=c.createStatement(); int i= s.executeUpdate(query); /* se lo statement eseguito non ha modificato alcuna riga dalla tabella lancio l'eccezione VoceAssente */ if (i==0) throw new VoceAssente(); } catch (SQLException e) { visualizzaEccezioneSQL(e); } finally { try { if (s!=null) s.close (); } catch (SQLException e) { visualizzaEccezioneSQL(e); } } } public void modifica(VoceDistributore voceVecchia, VoceDistributore voceNuova)throws VoceAssente { String query="UPDATE PRODOTTO SET TITOLO = '"+voceNuova.getTitolo()+"', AUTORE = '"+ voceNuova.getAutore()+"',DIMENSIONE = '"+ voceNuova.getDimensione()+"'WHERE TITOLO = '"+ voceVecchia.getTitolo()+"' AND AUTORE = '"+ voceVecchia.getAutore()+"'AND DIMENSIONE = '"+ voceVecchia.getDimensione()+"';"; Statement s=null; try { s=c.createStatement(); int i= s.executeUpdate(query); /* se lo statement eseguito non ha modificato alcuna riga dalla tabella lancio l'eccezione VoceAssente */ if (i==0) throw new VoceAssente(); } catch (SQLException e) { if(e.getErrorCode()==0){ JOptionPane.showMessageDialog(null,"Oggetto già presente nel database", "Operazione fallita",JOptionPane.ERROR_MESSAGE); }else{ visualizzaEccezioneSQL(e); } } finally { try { if (s!=null) s.close (); } catch (SQLException e) { visualizzaEccezioneSQL(e); } } }
se invece "dimensione" è di tipo int e nel database ci metto che il campo "dimensione" deve essere numerico, quando premo il tasto "modifica" o "cancella", allora escono le eccezioni del tipo:
Tipi di dati non corrispondenti nell'espressione criterio, codice di errore -3030.
non so se sono stato esaustivo, cmq grazie fin da adesso e se vi servono chiarimenti basta che me lo dite.
ciao

Rispondi quotando
