Errore Inconprensibile in Connessione a access

di il
11 risposte

Errore Inconprensibile in Connessione a access

Ringrazio in anticipo chi avrà la pazienza di aiutarmi.
Mi sto avvicinando a Java e sto iniziando a creare le prime form grafiche.
Ho creato una classe per effettuare la connessione al accdb e per poter effettuare una lettura di una tabella (per test).
va in errore e non ne capisco il motivo, per la mia ignoranza in materia.

allego il codice
public class ConnDb {

	
	private static final String USERNAME = "";  
	private static final String PASSWORD = "";  
	private static final String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
	private static final String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.accdb)};DBQ=C:\\Archivi\\Sif.accdb;}";
	
	static Connection conn = null;
	
	public static void main(String[] args) throws Exception {
		
		  try
	        {
	            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

	            conn = DriverManager.getConnection(database, USERNAME, PASSWORD);
	            Statement s = conn.createStatement();
	            

	            
	            // Fetch table
	            String selTable = "SELECT * FROM Anadip";
	            s.execute(selTable);
	            ResultSet rs = s.getResultSet();
	            while((rs!=null) && (rs.next()))
	            {
	                System.out.println(rs.getString(1) + " : " + rs.getString(2));
	            }
	            
	            
	            // close and cleanup
	            s.close();
	            conn.close();
	        }
	        catch(Exception ex)
	        {
	            ex.printStackTrace();
	        }
			
	}

}
questo il codic d'errore

Grazie e portate pazienza.
Ciao
Moreno
Allegati:
19656_762b58088b4806ed7029a0a347f2a1b2.jpg
19656_762b58088b4806ed7029a0a347f2a1b2.jpg

11 Risposte

  • Re: Errore Inconprensibile in Connessione a access

    misonsan ha scritto:


    va in errore e non ne capisco il motivo, per la mia ignoranza in materia.
    Stai usando JDK8 o superiore? Dal JDK8 il driver "ponte" JDBC-ODBC è stato rimosso, purtroppo.
  • Re: Errore Inconprensibile in Connessione a access

    Grazie Andbin per la cortese risposta.

    ho controllato e sto usando la Jdk-10.0.2
    Come posso risolvere il problema ?
    Sono bloccato con l'esecuzione del codice e ti sarei grato per la collaborazione.
    grazie

    Moreno
  • Re: Errore Inconprensibile in Connessione a access

    Puoi:

    1) cercare con Google "jdbc access"
    2) passare ad un DBMS SERIO come MySQL, SQL Server, Oracle, DB2, MariaDB, PostgreSQL, .... Ce ne sono N-milioni, meglio di Access.

    Per un progettino minimale (tabelle con qualche MILIONE di record), ti basta MariaDB o MySQL
    Se ti serve un DBMS SERIO (tabelle con MILIARDI di record) puoi usare SQL Server o Oracle

    Ogn'uno di questi ha un driver jdbc nativo (vuol dire che vai direttamente da java al dabms) e perfettamente funzionante.
  • Re: Errore Inconprensibile in Connessione a access

    Grazie migliorabile per il tuo suggerimento.

    Ho trovato in internet degli esempi, magari ne riporto uno, che rispecchiano il mio stesso codice.
    
     
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
     
    public class MsAccessDatabaseConnectionExample {
     
        public static void main(String[] args) {
     
            // variables
            Connection connection = null;
            Statement statement = null;
            ResultSet resultSet = null;
     
            // Step 1: Loading or registering Oracle JDBC driver class
            try {
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            }
            catch(ClassNotFoundException cnfex) {
                System.out.println("Problem in loading MS Access JDBC driver");
                cnfex.printStackTrace();
            }
     
            // Step 2: Opening database connection
            try {
     
                String msAccessDBName = 
                                       "D:\\WORKSPACE\\TEST_WORKSPACE\\Java-JDBC\\Player.accdb";
                String dbURL = 
                                    "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};                                      DBQ=" + msAccessDBName + ";DriverID=22;READONLY=true";
     
                // Step 2.A: Create and get connection using DriverManager class
                connection = DriverManager.getConnection(dbURL); 
     
                // Step 2.B: Creating JDBC Statement 
                statement = connection.createStatement();
     
                // Step 2.C: Executing SQL & retrieve data into ResultSet
                resultSet = statement.executeQuery("SELECT * FROM PLAYER");
     
                System.out.println("ID\tName\t\t\tAge\tMatches");
                System.out.println("==\t================\t===\t=======");
     
                // processing returned data and printing into console
                while(resultSet.next()) {
                    System.out.println(resultSet.getInt(1) + "\t" + 
                            resultSet.getString(2) + "\t" + 
                            resultSet.getString(3) + "\t" +
                            resultSet.getString(4));
                }
     
            }
            catch(SQLException sqlex){
                sqlex.printStackTrace();
            }
            finally {
     
                // Step 3: Closing database connection
                try {
                    if(null != connection) {
     
                        // cleanup resources, once after processing
                        resultSet.close();
                        statement.close();
     
                        // and then finally close connection
                        connection.close();
                    }
                }
                catch (SQLException sqlex) {
                    sqlex.printStackTrace();
                }
            }
        }
    }
    il risutato è questo:

    ID Name Age Matches
    == ================ === =======
    1 Sachin Tendulkar 43 200
    2 Shane Warne 45 145
    3 Kevin Pietersen 36 104
    4 Shahid Afridi 36 27
    5 Brian Lara 46 131
    6 Graeme Smith 36 117
    7 Mahela Jayawardene 38 145

    ho postato il codice, con le opportune personalizzazioni in una nuova classe, ma va sempre in errore.


    Quanto alla considerazione di utilizzare Data Base funzionalmente corretti, come SQL Server o MySql condivido.
    Ho utilizzato access solo per fare delle prove iniziali, dato che sul pc al momento non ho ancora installato SQL server.

    grazie

    Moreno
  • Re: Errore Inconprensibile in Connessione a access

    A me sembra chiaro che tu non sai cosa stai facendo (ti manca lo studio delle basi di JDBC).
    Step 1 del tuo codice: stai cercando di caricare la classe del bridge JDBC-ODBC che andbin ti ha già detto che non esiste più.
    Migliorabile ti ha suggerito di cercare con Google "jdbc access"... il terzo risultato era esattamente tutto ciò che ti serviva: http://ucanaccess.sourceforge.net/site.htm

    Ci trovi pure un tutorial passo passo (tra l'altro, l'autore di quella libreria è italiano e se non erro frequenta pure questo forum).

    Detto questo, a mio modesto avviso non ha nessun senso andare oltre se prima non ci si ferma a studiare quello che è basilare per JDBC.


    Ciao.
  • Re: Errore Inconprensibile in Connessione a access

    Scusami LeleFt
    Non avevo letto con attenzione il suggerimento di AndiBin relativo alla rimozione di "JDBC-ODBC".
    Ho scaricato quindi ucanaccess-4.0.4
    Utilizzo Eclipse come IDE.
    probabilmente ho sbagliato a inserire i moduli di ucanaccess-4.0.4
    Li ho inseriti in Programmi/jdk-10.0.2/bin
    perchè non funziona ancora.
    il codice aggiornato è:
    
    import java.sql.*;
    
    public class ConnDb {
    
    	   
    	public static void main(String[] args) throws Exception {
    	
    			Connection conn = null;
    			Statement s = null;
    			ResultSet rs = null;
    			
    	        try {
    	        	Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
    	        }
    	        catch(ClassNotFoundException ex) {
    	            System.out.println("Problem in loading MS Access JDBC driver");
    	            ex.printStackTrace();
    	            System.out.println(ex.getMessage());
    	        }
    			
    		  try
    	        {
    			  
    	            String msAccDB = "C:\\Archivi\\Sif.accdb";
    	            String database = "jdbc:ucanaccess://" + msAccDB; 
         
    
    	            conn = DriverManager.getConnection(database);
    	            
    	            System.out.println("Eseguita correttamente la connessione");
          
    	            s = conn.createStatement();
               
    	            // Fetch table
    	            String selTable = "SELECT * FROM Anadip";
    	            s.execute(selTable);
    	            rs = s.getResultSet();
    	            while((rs!=null) && (rs.next()))
    	            {
    	                System.out.println(rs.getString(1) + " : " + rs.getString(2));
    	            }
    	            s.close();
    	            conn.close();
    	        }
    	        catch(Exception ex)
    	        {
    	            ex.printStackTrace();
    	            System.out.println(ex.getMessage());
    	        }
    		
    	        finally {
    	        	 
    	            // Step 3: Closing database connection
    	            try {
    	                if(null != conn) {
    	 
    	                    // cleanup resources, once after processing
    	                    rs.close();
    	                    s.close();
    	 
    	                    // and then finally close connection
    	                    conn.close();
    	                }
    	            }
    	            catch (SQLException sqlex) {
    	                sqlex.printStackTrace();
    	            }
    	        }		
    	
    	}
    
    }
    
    
    errore:

    java.lang.ClassNotFoundException: net.ucanaccess.jdbc.UcanaccessDriver
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
    at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Unknown Source)
    at InternetDbConn.main(InternetDbConn.java:92)
    java.sql.SQLException: No suitable driver found for jdbc:ucanaccess://C:\Archivi\Sif.accdb
    at java.sql/java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql/java.sql.DriverManager.getConnection(Unknown Source)
    at InternetDbConn.main(InternetDbConn.java:107)
    Problem in loading MS Access JDBC driver
    net.ucanaccess.jdbc.UcanaccessDriver
    No suitable driver found for jdbc:ucanaccess://C:\Archivi\Sif.accdb

    hO DIMENTICATO QUALCHE iMPORT ?

    grazie

    Moreno
  • Re: Errore Inconprensibile in Connessione a access

    misonsan ha scritto:


    Li ho inseriti in Programmi/jdk-10.0.2/bin
    Assolutamente no. Tra l'altro non mettere mai roba "tua" extra sotto la "bin" di un JDK/JRE.

    Un jar deve semplicemente essere "in classpath". E per farlo ci sono in generale svariati modi (dipende se compili/esegui a mano, da un IDE, ecc..).

    La soluzione semplice e oltretutto per avere un progetto "portabile" in Eclipse:
    - sotto la "home" del tuo progetto fai una directory es. "lib" (allo stesso livello di "src", insomma)
    - poi da Eclipse: proprietà del progetto -> Java Build Path -> scheda "Libraries" -> pulsante "Add JARs..." (attenzione, NON il "Add External JARs...") e rintracci nella finestra il/i jar sotto quella "lib" che vuoi rendere disponibili.
  • Re: Errore Inconprensibile in Connessione a access

    Ciao Andbin
    ti ringrazio per la pazienza che porti, ma sono neofita anche di eclipse e quindi zoppico operativamente.
    Ho tolto innazi tutto i moduli inseriti erroneamente in "Programmi/jdk-10.0.2/bin"
    sotto la "home" del tuo progetto ho creato la cartella

    Riporto in allegati i passi seguiti.
    dimmi dove sbaglio.

    grazie

    Moreno

    per errore sono stati inseriti i file in ordine inverso.
    il primo che vedi è ovviamente l'ultimo come risultato dell'operatività.
    Allegati:
    19656_ff5f56bb78f918459c6846d0b24d2db0.jpg
    19656_ff5f56bb78f918459c6846d0b24d2db0.jpg

    19656_a1fb3c886e3aeacf369cdc4badd8dce5.jpg
    19656_a1fb3c886e3aeacf369cdc4badd8dce5.jpg

    19656_5c2a6a8f9b720abc50e722acfd8115a2.jpg
    19656_5c2a6a8f9b720abc50e722acfd8115a2.jpg
  • Re: Errore Inconprensibile in Connessione a access

    misonsan ha scritto:


    sotto la "home" del tuo progetto ho creato la cartella
    Sì ma dalla tua ultima immagine postata, risulta che quella "libDb" è ancora vuota! PRIMA ci devi copiare dentro tu il/i jar da mettere in classpath, POI dopo fai quella procedura nel Java Build Path per "tirare" dentro quel/i jar che sono nella libDb.

    Quella dialog JAR Selection evidentemente ignora le cartelle vuote.

    P.S. se hai già copiato o copierai i jar dall'ESTERNO di Eclipse (tramite un esplora risorse del sistema), devi fare in Eclipse un "refresh" sulla cartella (o più in alto, es. il progetto per intero), altrimenti Eclipse non vede subito il contenuto.
  • Re: Errore Inconprensibile in Connessione a access

    Ciao Andbin

    grazie per il prezioso consiglio.
    Ho fatto come hai consigliato, inserito i moduli nella cartella libdb, Fatto F5 per refresh e sucessivamente
    fatta procedura nel Java Build Path per "tirare" dentro quel/i jar che sono nella libDb.
    Funziona correttamente e riesco ad eseguire la connessione ad access.

    avrei un altro problema, ma dimmi tu se posso inserirlo qui o devo fare un messaggio.

    Ti faccio una breve sintesi dle problema, poi mi dirai come comportarmi.
    Spero non ti metterai a sorridere, ma provengo dal mondo C# (ho sviluppato un piccolissimo progetto in WPF)
    il mio problema è costituito dalla registrazione di utenti e relativi curriculum.
    Devo realizzare 3 form e precisamente:
    - form di login
    - form di gestione anagrafica (Inserimento, modifica,cancellazione utente)
    - un form con l'elenco degli utenti registrati
    - la visualizzazione del curriculum che deve avvenire navigando tramite un bottone presente sulla form di registrazione.

    Domande:
    Posso fare tutti i form in uno stesso progetto ?

    Vorrei creare una classe nella quale effettuare la connessione unica per il progetto da effettuarsi nella main e poi poter richiamare la conn nelle singole form quando mi necessita.
    Posso fare così o devo creare la conn in ogni form ?
    in ambito C# utilizzavo una classe singleton per creare la conn una sola volta

    La definizione dei campi e i metodi di utilizzo dei campi vanno definiti in ogni form o creo, come in C# le classi con le property e i metodi una sola volta e poi posso richiamarle in tutte la classi windows ? (mi scuserai se ho fatto un misto descrivendo in termine WPF / C#) o devo definirle in ogni form ?

    Da qui certamente capirai ceh ho molta strada da fare per capire a fondo l'utilizzo di Java.
    Lo trovo un linguaggio favoloso e per questo, anceh se faccio qualche figura barbina, ma vorrei capire bene i meccanismi per poter
    provare a replicare in ambiente java il programma fatto in WPF / C#

    queste sno le prime di una serie di somande che certamente mi verranno trada facendo.
    grazie
    Moreno
    Ti ringrazio per la pazienza e la disponibilità.
  • Re: Errore Inconprensibile in Connessione a access

    misonsan ha scritto:


    avrei un altro problema, ma dimmi tu se posso inserirlo qui o devo fare un messaggio.
    Ehm ... ci sono un po' troppe questioni. Ed al momento, vista l'ora, non riuscirei di certo a rispondere a tutte. Meglio magari se spezzi le questioni e le poni in discussioni separate.
Devi accedere o registrarti per scrivere nel forum
11 risposte