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

    Problemi con JDBC e SQL

    Salve, tramite Eclipse devo creare un programma con interfaccia grafica che mi permetta di compilare delle query su un database in MySql(in questo caso il database è composto da: automobile(modello, casa automobilistica, codice, cf_venditore, cf_acquirente, nr_posti e prezzo), venditore(nome,cognome,cf,sedelavorativa), acquirente(cf,nome,cognome,residenza),concessionar ia(nome,città).
    Visto che sono alle prime armi, prima di creare interfaccia grafica con i vari bottoni che mi permettano di eseguire le query, ho preferito prima di farlo tramite console.
    Il problema è che mi da sempre e praticamente gli stessi errori nonostante MySql sia in running e che non manchino ne le varie librerie per jdbc ecc...

    Ecco le tre classi:
    1(il main dove poi mi creerò l'interfaccia grafica)
    codice:
    package progetto;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Scanner;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    public class Grafica 
    {
            
        public static void main(String[] args) throws Exception
        {       
            DataAccess a= new DataAccess();
    
            a.aggiungiAutomobile();
            
            
        }
        
    }
    2)la classe DbUtils dove mi creo la connessione al database
    codice:
    package progetto;
    import java.sql.*;
    
    public class DBUtils 
    {
        public static PreparedStatement getPreparedStatement(String sql) throws SQLException, ClassNotFoundException
        {
            PreparedStatement ps=null;
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url= "jdbc:mysql://localhost:3306/progettodatabase"; 
            String user= "root"; 
            String pass= "qwerty"; 
            Connection con= DriverManager.getConnection(url, user, pass);
            ps=con.prepareStatement(sql);
    
            return ps;
       }
    
    }
    3)la classe DataAccess, dove mi andrò a costruire tutti i metodi per le varie query(al momento ho soltanto creato aggiungi Auto)
    codice:
    package progetto;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Scanner;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    public class DataAccess {
        public void aggiungiAutomobile() throws Exception {
            String codice;
            String modello;
            String casa_aut;
            String cf_acquirente;
            String cf_vend;
            int nrposti;
            double prezzo;
            System.out.println("Inserisci valori");
            Scanner s = new Scanner(System.in);
            System.out.println("Inserisci codice:");
             codice=s.nextLine();
             System.out.println("Inserisci modello");
             modello=s.nextLine();
             System.out.println("Inserisci casa automobilistica");
             casa_aut=s.nextLine();
             System.out.println("Inserisci CF dell'acquirente");
             cf_acquirente=s.next();
             System.out.println("Inserisci CF del venditore");
             cf_vend=s.next();
             System.out.println("Inserisci il numero di posti dell'automobile");
             nrposti=s.nextInt();
             System.out.println("Inserisci il prezzo");
             prezzo=s.nextDouble();
             s.close();
            try {
                PreparedStatement ps= DBUtils.getPreparedStatement("insert into Automobile (codice, modello, casa_aut, cf_acquirente, cf_vend, nrposti, prezzo) values(?,?,?,?,?,?,?)"); //ci vuole un punto interrogativo per ogni parametro
                ps.setString(1, codice);
                ps.setString(2, modello);
                ps.setString(3, casa_aut);
                ps.setString(4, cf_acquirente);
                ps.setString(5, cf_vend);
                ps.setInt(6, nrposti);
                ps.setDouble(7, prezzo);
                ps.executeUpdate();
            }  catch (SQLException ex) {
               Logger.getLogger(DataAccess.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    .
    Ogni volta che lo eseguo dopo aver inserito i vari dati per aggiungi automobile, mi compaiono i seguenti errori:
    codice:
    PM progetto.DataAccess aggiungiAutomobile
    GRAVE: null
    java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
        at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:835)
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455)
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at progetto.DBUtils.getPreparedStatement(DBUtils.java:13)
        at progetto.DataAccess.aggiungiAutomobile(DataAccess.java:35)
        at progetto.Grafica.main(Grafica.java:20)
    Tendo a precisare che creo questa discussione soltanto per un aiuto e un chiarimento su come si svolga la connessione tra Eclipse e MySql, non pretendo certo il progetto fatto e pronto, anzi, ho voglia di comprendere il perché mi da sempre errori e visto che non riesco a trovare varie soluzioni ne online, ne parlandone con colleghi d'università mi rivolgo in questo gruppo. Grazie per le possibili ed eventuali risposte.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Il DBMS non è correttamente configurato, nel senso che all'utente "root" non è stato dato l'accesso dalla macchina "localhost" (in MySQL ciascun utente può essere abilitato all'accesso da diverse macchine... in genere, l'utente "root" viene abilitato all'accesso senza alcuna macchina specificata (o 'root'@'%')... è sufficiente dare accesso a root anche da localhost.
    Accedi a MySQL con l'utente root da terminale e dai il seguente comando:

    codice:
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;

    Dovrebbe essere sufficiente.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    L'ho eseguito come query nel progetto e nada, continua a darmi errori così su eclipse:
    codice:
    Exception in thread "main" java.sql.SQLException: The server time zone value 'ora solare Europa occidentale' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
        at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76)
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:835)
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455)
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at progetto.Grafica.main(Grafica.java:26)
    Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'ora solare Europa occidentale' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85)
        at com.mysql.cj.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:132)
        at com.mysql.cj.protocol.a.NativeProtocol.configureTimezone(NativeProtocol.java:2241)
        at com.mysql.cj.protocol.a.NativeProtocol.initServerSession(NativeProtocol.java:2265)
        at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1319)
        at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:966)
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825)
        ... 6 more

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    A quanto pare, con le ultime versioni del driver JDBC sono necessari ulteriori parametri da dare in pasto al server durante la connessione (quindi, da passare nella URL string di connessione), tra i quali il TimeZone:

    codice:
    jdbc:mysql://localhost:3306/progettodatabase?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=CET

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Adesso mi da altri errori su casa_aut che mi dice che è sconosciuto il valore casa_aut, rimetto il codice modificato.( avevo sbagliato a mettere comunque, modello non esisteva nel database di mysql).

    1)Classe main:
    codice:
    package progetto;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Scanner;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    public class Grafica 
    {
            
        public static void main(String[] args) throws Exception
        {       
            DataAccess a= new DataAccess();
    
            a.aggiungiAutomobile();
    
        }
        
    }
    2)Classe connessione

    codice:
    package progetto;
    import java.sql.*;
    
    public class DBUtils 
    {
        public static PreparedStatement getPreparedStatement(String sql) throws SQLException, ClassNotFoundException
        {
            PreparedStatement ps=null;
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url= "jdbc:mysql://localhost:3306/progettodatabase?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=CET"; 
            String user= "root"; 
            String pass= "21marzo1995"; 
            Connection con= DriverManager.getConnection(url, user, pass);
            ps=con.prepareStatement(sql);
    
            return ps;
       }
    
    }
    3)classe coi metodi delle query
    codice:
    package progetto;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Scanner;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    public class DataAccess {
        public void aggiungiAutomobile() throws Exception {
            String codice;
            String modello;
            String casa_aut;
            String cf_acquirente;
            String cf_vend;
            int nrposti;
            double prezzo;
            System.out.println("Inserisci valori");
            Scanner s = new Scanner(System.in);
            System.out.println("Inserisci codice:");
             codice=s.nextLine();
             System.out.println("Inserisci casa automobilistica");
             casa_aut=s.nextLine();
             System.out.println("Inserisci CF dell'acquirente");
             cf_acquirente=s.next();
             System.out.println("Inserisci CF del venditore");
             cf_vend=s.next();
             System.out.println("Inserisci il numero di posti dell'automobile");
             nrposti=s.nextInt();
             System.out.println("Inserisci il prezzo");
             prezzo=s.nextDouble();
             s.close();
            try {
                PreparedStatement ps= DBUtils.getPreparedStatement("insert into Automobile (codice, casa_aut, cf_acquirente, cf_vend, nrposti, prezzo) values(?,?,?,?,?,?)"); //ci vuole un punto interrogativo per ogni parametro
                ps.setString(1, codice);
                ps.setString(2, casa_aut);
                ps.setString(3, cf_acquirente);
                ps.setString(4, cf_vend);
                ps.setInt(5, nrposti);
                ps.setDouble(6, prezzo);
                ps.executeUpdate();
            }  catch (SQLException ex) {
               Logger.getLogger(DataAccess.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Non ho capito se ora funziona oppure no.
    Ad ogni modo, ti suggerisco di gestire diversamente le PreparedStatement:

    codice:
    // Dichiarare gli oggetti fuori dal try/catch e inizializzarli a null
    PreparedStatement ps = null;
    try {
       // creare e usare le PreparedStatement
       ps = DBUtils.getPreparedStatement( ... );
       ...
       ps.executeUpdate();
    } catch (Exception e) {
       // Logging degli errori
       ...
    } finally {
       // Chiusura di tutti gli statement
       if (ps != null) {
          try { ps.close(); } catch (Exception e) { }
       }
    }

    Se hai una query di selezione, utilizzerai dei ResultSet per ottenere i dati: anche quelli andrebbero dichiarati FUORI dal blocco try/catch e chiusi nel blocco finally. Questo ti garantisce di non lasciare risorse aperte sul DB che a lungo andare sono dannose.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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 © 2024 vBulletin Solutions, Inc. All rights reserved.