Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    problemi di modifica dati da una form in swing verso access

    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.
    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;
    	}
    }
    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 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);
    		}
    			
    	}
    Questa invece è la classe DistributoreDB che raccoglie i dati sopra e mi fa le interrogazioni sul database access
    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);
                            }
                    }            
            }
    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.
    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

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    I valori numerici nel sql vanno senza apici. Prova a togliere gli apici attorno a v.getDimensione

  3. #3
    allora per quanto riguarda quello che mi hai detto simo e cioè che:
    I valori numerici nel sql vanno senza apici. Prova a togliere gli apici attorno a v.getDimensione.
    ok funziona.

    ora ci sono altri 3 errori:
    1) errore: nel file DistributoreDB.java ci sta il metodo "inserisci", e nel blocco try io verificavo se i campi che vedi giù, erano stati compilati e in caso negativo veniva lanciato quel throw new VoceAssente();
    codice:
     try {
               if (v.getTitolo().equalsIgnoreCase("") || v.getAutore().equalsIgnoreCase("") 
               || v.getDimensione().equalsIgnoreCase(""))
                                    throw new VoceAssente();
    che veniva raccolto dalla classe GUIDistributore nel punto che gestisce la pressione del pulsante "inserisci"

    codice:
    catch(VoceAssente e){					
    					
    JOptionPane.showMessageDialog(null,"Devi riempire i campi obbligatori", "Attenzione",JOptionPane.ERROR_MESSAGE);
    ora l'errore sta in v.getDimensione().equalsIgnoreCase("") che non funziona con gli interi e mi dice "DistributoreDB.java:202: int cannot be dereferenced"

    2)errore: nella classe GUIDistributore quando viene gestito la pressione del pulsante "inserisci"
    mi da un errore di tipo.. cannot find symbol
    symbol : constructor VoceDistributore(java.lang.String,java.lang.String ,java.lang.String)

    location: class VoceDistributore
    VoceDistributore v=new VoceDistributore(titolo.getText(),autore.getText() ,dimensione.getText());

    ma come è possibile se nella class VoceDistributore, "dimensione" nel costruttore è un intero?

    ps stesso errore per la modifica.

    3)ultimo errore: sta qui, nella classe GUIDistributore.
    il problema sta nel fatto che non scrivo più una stringa nella casella di testo che si chiama "dimensione2" ma ci devo scrivere un intero.
    codice:
    public void valueChanged(ListSelectionEvent e) {
    		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());//GUIDistributore.java:485: //setText(java.lang.String) in javax.swing.text.JTextComponent cannot be applied to (int)
    
    			setEnabledAt(2,true);
    grazie ancora..

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Errore 1) come hai detto tu stesso,se getDimensione restituisce un intero, non puoi usare il metodo equalsIgnooreCase che e' della classe string.
    Errore 2) il costruttore vuole (String,String,int) tu gli passi tre String.Il metodo getText() restituisce una String.
    Errore 3) C'e' scritto accanto! Vuole una String non un int.
    dimensione2.setText(""+voceSelezionata.getDimensio ne());

    P.s. La prossima volta cerca di leggere atttentamente i messaggi d'error e controlla la documentazione ufficiale dei metodi che ti danno errore. Vedrai che il piu' delle volte riuscirai a corregger da solo certe piccolezze.

  5. #5
    we simo ciao, infatti gli errori li avevo tutti corretti prima ancora che mi rispondessi..
    stavolta ho fatto più attenzione.
    cmq il tuo aiuto è sempre prezioso..
    ciao

  6. #6
    una cosa sola..
    se invece degli interi gli voglio far prendere i numeri in virgola mobile, sotto ho scritto:
    codice:
    public void actionPerformed(ActionEvent ae) {
    	Object o=ae.getSource();
    	if (o instanceof JButton) {
    	if (o==inserisci) {
    
    VoceDistributore v=new VoceDistributore(titolo.getText(),autore.getText(),Double.parseDouble(dimensione.getText());
    quando compilo la classe GUIDistributore mi esce queso errore.

    symbol : constructor VoceDistributore(java.lang.String,java.lang.String ,double)
    location: class VoceDistributore
    VoceDistributore v=new VoceDistributore(titolo.getText(),autore.getText() ,Double.parseDouble(dimensione.getText());

    però io nella classe VoceDistributore gli ho detto che dimensione deve essere di tipo Double.
    con gli interi non mi dava problemi.
    ho sbagliato qualcosa?
    ciao

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    La maiuscola, credo. Double.parseDouble() restituisce un double (con la minuscola) che e' un tipo primitivo. Tu in voci cd probabilmente hai messo Double con la maiuscola che e' la classe wrapper.

  8. #8
    ciao, non è quello perchè in VociDistributore ho messo:
    codice:
    public class VoceDistributore {
    	private String titolo;
    	private String autore;
    	private double dimensione;
    	
    	
    	public VoceDistributore(String titolo, String autore,double dimensione) {
    		this.titolo=titolo;
    		this.autore=autore;		
    		this.dimensione=dimensione;
    		
    	}
    	
    	public String getTitolo() {
    		return titolo;
    	}
    	public String getAutore() {
    		return autore;
    	}
    	public double getDimensione() {
    		return dimensione;
    	}
    	
    	
    	public String toString() {
    		return "TIT: "+titolo+" AUT: "+autore+" DIM: "+dimensione;
    	}
    }
    boh? a meno che J2SE non supporta i double, forse ho sparato una scemenza..eh eh

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Li supporta. Ti dice cannot find symbol come errore? Strano, hai ricompilato tutto?

  10. #10
    tutto ok, risolto.

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.