import java.sql.*; // Questa classe ha lo scopo di gestire l'interfaccia con il DB // in maniera trasparente rispetto alle altre classi dell'applicazione public class GestioneDB { private Connection connessione; private Statement lineaComandi; private ResultSet risultatoUltimaQuery; private ResultSetMetaData campiUltimaQuery; private int risultatoUltimoUpdate; public GestioneDB( ) { try { // Tenta di caricare il driver JDBC-ODBC // Se il driver non viene trovato lancia una 'ClassNotFoundException' Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException exception) { System.err.print("Non ho trovato il driver JDBC-ODBC"); System.exit(1); } finally { connessione = null; lineaComandi = null; risultatoUltimaQuery = null; campiUltimaQuery = null; risultatoUltimoUpdate = 0; } } // 'fileDB' è il nome (completo di percorso) del DB Access con cui connettersi public void apri( String fileDB ) { try { // Tenta di stabilire la connessione e una linea comandi // Se il tentativo fallisce lancia una 'SQLException' connessione = DriverManager.getConnection(fileDB); lineaComandi = connessione.createStatement(); } catch (SQLException exception) { System.err.print("Errore nell'apertura del DB: " + exception); System.exit(1); } } // Chiusura della connessione al DB public void chiudi( ) { try { lineaComandi.close(); connessione.close(); } catch (SQLException exception) { System.err.print("Errore nella chiusuradel DB: " + exception); System.exit(1); } } // Esegue una generica query SQL sul DB: il risultato viene memorizzato // nell'attributo 'risultatoUltimaQuery', mentre i campi del risultato // vengono memorizzati nell'attributo 'campiUltimaQuery'. Se la query // fallisce, entrambe gli attributi sono impostati al valore 'null' public void eseguiQuerySql( String querySql ) { try { risultatoUltimaQuery = lineaComandi.executeQuery(querySql); campiUltimaQuery = risultatoUltimaQuery.getMetaData(); } catch (SQLException exception) { System.err.println("Errore nell'esecuzione della query: " + exception); risultatoUltimaQuery = null; campiUltimaQuery = null; } } // Esegue un generico update SQL sul DB: il risultato viene memorizzato // nell'attributo 'risultatoUltimoUpdate' public void eseguiUpdateSql( String updateSql ) { try { risultatoUltimoUpdate = lineaComandi.executeUpdate(updateSql); } catch (SQLException exception) { System.err.println("Errore nell'esecuzione dell'update: " + exception); risultatoUltimoUpdate = 0; } } // Metodi per la gestione dell'intestazione del result set public int restituisciNumeroCampi( ) { try { return campiUltimaQuery.getColumnCount(); } catch (SQLException exception) { return 0; } } public String restituisciNomeCampo( int i ) { try { return campiUltimaQuery.getColumnName(i); } catch (SQLException exception) { return null; } } // Metodi per la gestione del result set public boolean avanzaAlProssimoRecord() { try { return risultatoUltimaQuery.next(); } catch (SQLException exception) { return false; } } public void iniziaScansioneRecord() { try { risultatoUltimaQuery.beforeFirst(); } catch (SQLException exception) { // Non esegue alcunché } } public Object restituisciOggetto(int i) { try { return risultatoUltimaQuery.getObject(i); } catch (SQLException exception) { return null; } } // Verifica se l'ultimo update è andato a buon fine public boolean restituisciRisultatoUltimoUpdate() { return (risultatoUltimoUpdate != 0 ? true : false); } // Elabora il risultato dell'ultima query sotto forma di una String // Se ci sono stati problemi con l'ultima query, restituisce 'null' public String restituisciRisultatoComeTesto() { StringBuffer risultato = new StringBuffer(""); int numeroCampi = restituisciNumeroCampi(); if (numeroCampi > 0) { for ( int i = 1; i <= numeroCampi; i++ ) { String campo = restituisciNomeCampo(i); if (campo != null) { risultato.append(restituisciNomeCampo(i) + "\t"); } } risultato.append( "\n" ); } while (avanzaAlProssimoRecord()) { for ( int i = 1; i <= numeroCampi; i++ ) { Object valore = restituisciOggetto(i); if (valore != null) { risultato.append(valore + "\t"); } } risultato.append("\n"); } return risultato.toString(); } // Un main con funzione di testing (non è il main dell'applicazione) public static void main(String[] args) { // Crea la connessione al DB tramite la classe GestioneDB GestioneDB gestioneDB = new GestioneDB(); String myDB = "jdbc:odbc:Agenda"; gestioneDB.apri(myDB); // Query di prova (1) String query1 = "SELECT * FROM Recapiti;"; gestioneDB.eseguiQuerySql(query1); System.out.println("QUERY 1 =============================="); System.out.print(gestioneDB.restituisciRisultatoComeTesto()); // Update di prova (1) String update1 = "INSERT INTO Recapiti " + "(nome,cognome,indirizzo,cap,città,telefono,mail) " + "VALUES ('Ersilio','Rossi','Corso Torino'," + "'16100','Genova','010813456','ersilio@mbox.it');"; gestioneDB.eseguiUpdateSql(update1); System.out.println("UPDATE 1: " + gestioneDB.restituisciRisultatoUltimoUpdate()); // Query di prova (2) String query2 = "SELECT * FROM Recapiti;"; gestioneDB.eseguiQuerySql(query2); System.out.println("QUERY 2 =============================="); System.out.print(gestioneDB.restituisciRisultatoComeTesto()); // Update di prova (2) String update2 = "UPDATE Recapiti " + "SET indirizzo='Corso Torino, 3' " + "WHERE nome='Ersilio' AND cognome='Rossi';"; gestioneDB.eseguiUpdateSql(update2); System.out.println("UPDATE 2: " + gestioneDB.restituisciRisultatoUltimoUpdate()); // Query di prova (2) String query3 = "SELECT nome,cognome,indirizzo FROM Recapiti " + "WHERE nome='Ersilio' AND cognome='Rossi';"; gestioneDB.eseguiQuerySql(query3); System.out.println("QUERY 3 =============================="); System.out.print(gestioneDB.restituisciRisultatoComeTesto()); // Update di prova (3) String update3 = "DELETE FROM Recapiti " + "WHERE nome='Ersilio' AND cognome='Rossi';"; gestioneDB.eseguiUpdateSql(update3); System.out.println("UPDATE 3: " + gestioneDB.restituisciRisultatoUltimoUpdate()); // Query di prova (4) String query4 = "SELECT * FROM Recapiti;"; gestioneDB.eseguiQuerySql(query4); System.out.println("QUERY 4 =============================="); System.out.print(gestioneDB.restituisciRisultatoComeTesto()); // Chiude la connessione al DB gestioneDB.chiudi(); System.exit(0); } }