Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    177

    Problemi con la connessione di un db access in java

    Salve a tutti, devo connettere un database access con java, sto usando la pillola contenuta in questo forum, uso la tipologia del driver JDBC descritta all'interno della pillola, ma non riesco a farla girare, devo aver commesso alcuni errori. Il codice scritto da me è:
    codice:
    import java.sql.*;
    import java.util.Vector;
    
    public class Database {
    	private String nomeDB;       // Nome del Database a cui connettersi
    	private String nomeUtente;   // Nome utente utilizzato per la connessione al Database
    	private String pwdUtente;    // Password usata per la connessione al Database
    	private String errore;       // Raccoglie informazioni riguardo l'ultima eccezione sollevata
    	private Connection db;       // La connessione col Database
    	private boolean connesso;    // Flag che indica se la connessione è attiva o meno
    
    	public Database(String nomeDB) {
    		this(nomeDB, "", "");
    	}// costruttore per l'accesso anonimo
    
    	public Database(String nomeDB, String nomeUtente, String pwdUtente) {
    		this.nomeDB = nomeDB;
    		this.nomeUtente = nomeUtente;
    		this.pwdUtente = pwdUtente;
    		connesso = false;
    		errore = "";
    	}// costruttore per l'accesso autenticato
    
       // Apre la connessione con il Database
    	public boolean connetti() {
    		connesso = false;
    		try {
    			// Carico il driver JDBC per la connessione con il database MySQL
    			Class.forName("com.mysql.jdbc.Driver");
    			// Controllo che il nome del Database non sia nulla
    			if (!nomeDB.equals("")) {
    				// Controllo se il nome utente va usato o meno per la connessione
    				if (nomeUtente.equals("")) {
    					// La connessione non richiede nome utente e password
    					db = DriverManager.getConnection("jdbc:mysql://localhost/" + nomeDB);
    				} 
    				else {
    					// La connessione richiede nome utente, controllo se necessita anche della password
    					if (pwdUtente.equals("")) {
    						// La connessione non necessita di password
    						db = DriverManager.getConnection("jdbc:mysql://localhost/" + nomeDB + "?user=" + nomeUtente);
    					} 
    					else {
    						// La connessione necessita della password
    						db = DriverManager.getConnection("jdbc:mysql://localhost/" + nomeDB + "?user=" + nomeUtente + "&password=" + pwdUtente);
    					}
    				}
    				// La connessione è avvenuta con successo
    				connesso = true;
    			} 
    			else {
    				System.out.println("Manca il nome del database!!");
    				System.out.println("Scrivere il nome del database da utilizzare all'interno del file \"config.xml\"");
    				System.exit(0);
    			}
    		} 
    		catch (Exception e) { 
    			errore = e.getMessage(); 
    		}
    		return connesso;
    	}
    	
    	// Esegue una query di selezione dati sul Database
    	// query: una stringa che rappresenta un'istruzione SQL di tipo SELECT da eseguire
    	// colonne: il numero di colonne di cui sarà composta la tupla del risultato
    	// ritorna un Vector contenente tutte le tuple del risultato
    	public Vector eseguiQuery(String query) {
    		Vector v = null;
    		String [] record;
    		int colonne = 0;
    		try {
    			Statement stmt = db.createStatement();// Creo lo Statement per l'esecuzione della query
    			ResultSet rs = stmt.executeQuery(query);// Ottengo il ResultSet dell'esecuzione della query
    			v = new Vector();
    			ResultSetMetaData rsmd = rs.getMetaData();
    			colonne = rsmd.getColumnCount();
    			while(rs.next()) {   // Creo il vettore risultato scorrendo tutto il ResultSet
    				record = new String[colonne];
    				for (int i=0; i<colonne; i++) record[i] = rs.getString(i+1);
    				v.add( (String[]) record.clone() );
    			}
    			rs.close();     // Chiudo il ResultSet
    			stmt.close();   // Chiudo lo Statement
    		} 
    		catch (Exception e) { 
    			e.printStackTrace(); errore = e.getMessage();
    		}
    		return v;
    	}
    
    	// Esegue una query di aggiornamento sul Database
    	// query: una stringa che rappresenta un'istuzione SQL di tipo UPDATE da eseguire
    	// ritorna TRUE se l'esecuzione è adata a buon fine, FALSE se c'è stata un'eccezione
    	public boolean eseguiAggiornamento(String query) {
    		int numero = 0;
    		boolean risultato = false;
    		try {
    			Statement stmt = db.createStatement();
    			numero = stmt.executeUpdate(query);
    			risultato = true;
    			stmt.close();
    		} 
    		catch (Exception e) {
    			e.printStackTrace();
    			errore = e.getMessage();
    			risultato = false;
    		}
    		return risultato;
    	}
    
    	// Chiude la connessione con il Database
    	public void disconnetti() {
    		try {
    			db.close();
    			connesso = false;
    		} 
    		catch (Exception e) { 
    			e.printStackTrace(); 
    		}
    	}
    
    	public boolean isConnesso() { 
    		return connesso; 
    	}// Ritorna TRUE se la connessione con il Database è attiva
    	
    	public String getErrore() { 
    		return errore; 
    	}// Ritorna il messaggio d'errore dell'ultima eccezione sollevata
    il metodo scritto per verificarlo è:
    codice:
    public static void main(String[] args) {
    		
    		Database db = new Database("EstrattorePDF.mdb");
    		if ( !db.connetti() ) {
    			System.out.println("Errore durante la connessione.");
    			System.out.println( db.getErrore() );
    			System.exit(0);
    		}
    		// Eseguo una query sul database. La tabella si chiama Tbl.
    		Vector v = db.eseguiQuery( "SELECT * FROM Tbl;" );
    		// Stampiamo i risultati:
    		int i = 0;
    		while ( i<v.size() ) {
    			String[] record = (String[]) v.elementAt(i);
    			System.out.println("Record numero " + (i+1) );
    			for (int j=0; j<record.length; j++) {
    				System.out.println( record[j] );
    			}
    		}
    		// Eseguo un aggiornamento sul campo 'nomecampo' della tabella Tbl:
    		if ( !db.eseguiAggiornamento("UPDATE Tbl SET nomecampo=valore WHERE nomecampo>0;") ) {
    			System.out.println("Errore nell'aggiornamento!");
    			System.out.println( db.getErrore() );
    		}
    		// Ora chiudo la connessione col Database:
    		db.disconnetti();
    	}
    che stampa:
    Errore durante la connessione.
    com.mysql.jdbc.Driver

    non so di preciso dove ho sbagliato, io penso si dovuto al fatto che ho caricato male il Connector-j. Come faccio per farla funzionare? dove sbaglio?
    Teo

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    268
    quello che hai copiato serve per collegarsi ad un db MySql e non Access.

    Ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    177
    hai rag ho sbagliato, ho strutturato entrambe le classi, dovevo copiare il codice fatto con il pattern bridge, ora correggo
    Teo

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    177

    Codice corretto

    la classe esatta
    codice:
    import java.sql.*;
    import java.util.Vector;
    
    public class DatabaseBridge {
    
       private String nomeDSN;         // Nome DSN dell'origine dati ODBC
       private String[][] attributi;   // Insieme di attributi da usare per la connessione
       private String errore;          // Stringa contenente un eventuale messaggio di errore
       private Connection db;          // Oggetto che rappresenta la connessione col DB
       private boolean connesso;       // Flag che indica se il DB è connesso o meno
    
       public DatabaseBridge(String nomeDSN) {
          this.nomeDSN = nomeDSN;
          attributi = new String[0][0];
          connesso = false;
       }
    
       public DatabaseBridge(String nomeDSN, String [][] attributi) {
          this.nomeDSN = nomeDSN;
          this.attributi = attributi;
          connesso = false;
       }
    
       public boolean connetti() {
          connesso = false;
          try {
    
             // Carico il bridge JDBC-ODBC per la connessione con il database
             Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    
             String conString = "jdbc:odbc:" + nomeDSN;   // Il nome del DSN può anche essere vuoto!!
    
             // Controllo se ci sono attributi ausiliari da usare per la connessione
             if (attributi.length > 0) {
    
                // Uso gli attributi per la connessione
                for (int i=0; i<attributi.length; i++) {
                   conString += ";" + attributi[i][0] + "=" + attributi[i][1];
                }
             }
    
             // Effettuo la connessione
             db = DriverManager.getConnection( conString );
    
             // La connessione è avvenuta con successo
             connesso = true;
          } catch (Exception e) { errore = e.getMessage(); }
    
          return connesso;
       }
    
       // Esegue una query di selezione dati sul Database
       // query: una stringa che rappresenta un'istruzione SQL di tipo SELECT da eseguire
       // colonne: il numero di colonne di cui sarà composta la tupla del risultato
       // ritorna un Vector contenente tutte le tuple del risultato
       public Vector eseguiQuery(String query) {
          Vector v = null;
          String [] record;
          int colonne = 0;
          try {
             Statement stmt = db.createStatement();     // Creo lo Statement per l'esecuzione della query
             ResultSet rs = stmt.executeQuery(query);   // Ottengo il ResultSet dell'esecuzione della query
             v = new Vector();
             ResultSetMetaData rsmd = rs.getMetaData();
             colonne = rsmd.getColumnCount();
    
             while(rs.next()) {   // Creo il vettore risultato scorrendo tutto il ResultSet
                record = new String[colonne];
                for (int i=0; i<colonne; i++) record[i] = rs.getString(i+1);
                v.add( (String[]) record.clone() );
             }
    
             rs.close();     // Chiudo il ResultSet
             stmt.close();   // Chiudo lo Statement
          } catch (Exception e) { e.printStackTrace(); errore = e.getMessage(); }
    
          return v;
       }
    
       // Esegue una query di aggiornamento sul Database
       // query: una stringa che rappresenta un'istuzione SQL di tipo UPDATE da eseguire
       // ritorna TRUE se l'esecuzione è adata a buon fine, FALSE se c'è stata un'eccezione
       public boolean eseguiAggiornamento(String query) {
          int numero = 0;
          boolean risultato = false;
          try {
             Statement stmt = db.createStatement();
             numero = stmt.executeUpdate(query);
             risultato = true;
             stmt.close();
          } catch (Exception e) {
             e.printStackTrace();
             errore = e.getMessage();
             risultato = false;
          }
          return risultato;
       }
    
       // Chiude la connessione con il Database
       public void disconnetti() {
          try {
             db.close();
             connesso = false;
          } catch (Exception e) { e.printStackTrace(); }
       }
    
       public boolean isConnesso() { return connesso; }   // Ritorna TRUE se la connessione con il Database è attiva
       public String getErrore() { return errore; }       // Ritorna il messaggio d'errore dell'ultima eccezione sollevata
    }
    Il main:
    codice:
    import java.util.Vector;
    
    public class TestDatabaseBridge {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		
    		String [][] parametri = {{"DRIVER", "Microsoft Access Driver (*.mdb)"},
                    {"DBQ", "EstrattorePDF.mdb"}
                   };
    
    		DatabaseBridge db = new DatabaseBridge("", parametri);  // Nota: il nome DSN è vuoto!
    
    //Effettuiamo la connessione:
    if ( !db.connetti() ) {
    System.out.println("Errore durante la connessione!");
    System.out.println( db.getErrore() );
    System.exit(0);
    }
    
    //Reperiamo i dati attraverso una query. Nome della tabella: Tbl.
    Vector v = db.eseguiQuery("SELECT * FROM Tbl;");
    
    //Stampiamo i risultati:
    int i=0;
    while ( i<v.size() ) {
    System.out.println("Record numero " + (i+1));
    String [] record = (String[]) v.elementAt(i);
    for (int j=0; j<record.length; j++)
    System.out.println( record[j] );
    }
    
    //Eseguiamo un'aggiornamento sulla tabella Tbl:
    if ( !db.eseguiAggiornamento("UPDATE Tbl SET campo=valore WHERE campo>1;") ) {
    System.out.println("Errore nell'aggiornamento!");
    System.out.println( db.getErrore() );
    }
    
    //Chiudiamo la connessione col database:
    db.disconnetti();
    	}
    che stampa l'errore
    java.sql.SQLException: [Microsoft][Driver ODBC Microsoft Access] Il modulo di gestione di database Microsoft Jet non è in grado di trovare la tabella o la query di input 'Tbl'. Verificare che esista e che il nome sia stato digitato correttamente.
    at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcStatement.execute(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(Unkno wn Source)
    at test.DatabaseBridge.eseguiQuery(DatabaseBridge.jav a:69)
    at test.TestDatabaseBridge.main(TestDatabaseBridge.ja va:26)
    Exception in thread "main" java.lang.NullPointerException
    at test.TestDatabaseBridge.main(TestDatabaseBridge.ja va:30)
    Teo

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    268
    Vector v = db.eseguiQuery("SELECT * FROM Tbl;");

    qui dovresti specificare meglio la tua query.

    In sostanza se devi estrarre i dati da una tua tabella ad esempio la tabella conti la tua istruzione sql sarà:

    select * from conti;

    in sql la notazione * indica che vogliamo prendere tutti i campi della tabella.

    Cerca di studiare il codice che trovi su internet altrimenti fai pochi passi avanti nella programmazione.

    Ciao

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    177
    grazie ora provo, questo è il mio primo tentativo con un db access
    Teo

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    177
    sembra che funziona, adesso voglio poter arricchire il mio database con dei valori, EstrattorePDF è composto da due tabelle files e testo. Nel seguente main cerco di inserire dei valori a files per poi stamparli, ma continua a non funzionare, mi da problemi il codice quando carico il valore non riconosce files."tbl colonna"
    codice:
    public class TestInserimentoDB {
    	public static void main(String[] args) {
    		String [][] parametri = {{"DRIVER", "Microsoft Access Driver (*.mdb)"},
    				{"DBQ", "EstrattorePDF.mdb"}};
    		DatabaseBridge db=new DatabaseBridge("",parametri);
    		if ( !db.connetti() ) {
    			System.out.println("Errore durante la connessione!");
    			System.out.println( db.getErrore() );
    			System.exit(0);
    		}
    		else 
    			System.out.println("Connessione ok");
    		db.eseguiQuery("INSERT INTO files (ID,NomeFile,protetto,processato,DataUltimoProcesso) VALUES (#"
                                + files.ID
                                + "'1'"
                                + files.NomeFile
                                + "'prima prova'"
                                + files.protetto
                                + "'0'"
                                + files.processato
                                + "'1'"
                                + filse.DataUltimoProcesso
                                + "'31/10/2011'"
                                );
                                 
    		
    		@SuppressWarnings("rawtypes")
    		Vector v = db.eseguiQuery("SELECT * FROM files;");
    		int i=0;
    		while ( i<v.size() ) {
    			System.out.println("Record numero " + (i+1));
    			String [] record = (String[]) v.elementAt(i);
    			for (int j=0; j<record.length; j++)
    				System.out.println( record[j] );
    		}
    		if ( !db.eseguiAggiornamento("UPDATE files SET campo=valore WHERE campo>1;") ) {
    			System.out.println("Errore nell'aggiornamento!");
    			System.out.println( db.getErrore() );
    		}
    		db.disconnetti();
    		System.out.println("Disconnessione ok");
    	}
    scusatemi sono un novizio, come studio una cosa cerco di applicarla su esempi pratici ma sto incontrando dei blocchi in parte li risolvo da solo ed in parte mi tocca chiedere.
    Teo

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ok. Il problema di connessione al DB è stato risolto. Se hai un nuovo problema, che non ha nulla a che vedere con "Connessione a un DB Access Java" (titolo della discussione), aprine una nuova con il nuovo argomento... altrimenti diventa tutto un mescolarsi di problemi.


    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

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    177
    per la connessione in lettura si ora il problema è la connessione in scrittura
    Teo

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    268
    l'insermento devi farlo:

    insert into nome_tabella (elencon_campi) values (valore1, valore2,...valorexxx)

    importante i valori devono essere separati da , cosa che non hai fatto.

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.