Connessione ad un Database access senza utilizzare ODBC

Stato
Discussione chiusa ad ulteriori risposte.

R4z0r_Cr4sH

Utente Electrum
10 Giugno 2007
501
11
6
148
Quando dobbiamo utilizzare un database locale (ad esempio un database access) in Java bisogna caricare il rispettivo Driver e selezionare il database nell'Origine dati (ODBC) (è possibile vedere più precisamente come a questo link).
Di seguito riporto un banale esempio:

Codice:
import javax.swing.JOptionPane;
import java.sql.*;

public class ConnectionExample{
String url="jdbc:odbc:mydatabase";
Connection con;

public void openConnection(){
        try{
             Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        }catch(ClassNotFoundException e){
            JOptionPane.showMessageDialog(null,"Driver per database non trovato: "+e.getMessage(),"Messaggio:",0,null); 
        }try{
            con = DriverManager.getConnection(url,"","");
        }catch(SQLException e){                
            JOptionPane.showMessageDialog(null,"Connessione Fallita: "+e.getMessage(),"Messaggio:",0,null); 
        }   
    }
}

La classe contiene un solo metodo,openConnection(),che si occupa di aprire la connessione con il database.Al suo interno troviamo due blocchi di gestione delle eccezioni (due blocchi try-catch),nel primo vediamo il caricamento del Driver JDBC(noto anche come "JDBC-ODBC Bridge") che sfrutta in modo nativo ODBC (infatti le chiamate ai metodi JDBC vengono convertire in chiamate a funzione ODBC),nel secondo blocco l'apertura della connessione utilizzando il metodo getConnection() di classe DriverManager.
Per ovviare alla rottura di dover ogni volta andare ad impostrare nell'origina dati la connessione al database,con una piccola modifica al codice possiamo comunque aprire la nostra connessione al database.In questo modo sarà il nostro programma,e non l'ODBC,a caricare il driver necessario.Tutto ciò che ci serve è la tabella presente in fondo alla pagina al link precedente che per comodità riporto anche qui:

[align=center][img=500x400]http://img709.imageshack.us/img709/2749/stringimage.jpg[/img]
(Clicca sull'immagine per ingrandire)[/align]

Tutto quello di cui abbiamo bisogno è della rispettiva stringa nella tabella appena riportata.Nel nostro esempio utilizziamo un database Access passando attraverso l'ODBC (anche se in modo indiretto),la stringa che andremo ad utilizzare quindi sarà:

Codice:
driver={Microsoft Access Driver (*.mdb)}; dbq=C:\database.mdb; id=Admin; Pwd=Prova;

Ipotizzando che il nostro database si trovi in C: \ ,si chiami myDatabase.mdb e non abbia restrizioni,il nostro codice diventa:

Codice:
import javax.swing.JOptionPane;
import java.sql.*;

public class ConnectionExample{
String url="jdbc:odbc:mydatabase";
Connection con;

public void openConnection(){
        try{
             Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        }catch(ClassNotFoundException e){
            JOptionPane.showMessageDialog(null,"Driver per database non trovato: "+e.getMessage(),"Messaggio:",0,null); 
        }try{
           con=DriverManager.getConnection("jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=C:\myDatabase.mdb");
        }catch(SQLException e){                
            JOptionPane.showMessageDialog(null,"Connessione Fallita: "+e.getMessage(),"Messaggio:",0,null); 
        }   
    }
}

la modifica viene apportata nel secondo blocco try-catch e ci permette di caricare in modo diretto il driver da utilizzare per aprire la connessione sul database specificato.

[ot]mi è venuta la voglia di trovare un modo per ovviare alla rottura di impostare ogni volta l'ODBC ed ecco qui la soluzione...so sicuro che se la mostro al mio professore di informatica anche quest'anno dirà che io i programmi li copio da internet e che non è tutto frutto del mio sacco (ed io odio quando non mi viene attribuito il mio lavoro).[/ot]
 
RE: Connessione ad un Database locale evitando l'origine dati (ODBC)

Ottimo Razor ^^ , l'avessi fatto qualche tempo fa sta guida te ne sarei stato grato :p visto le difficoltà che ho incontrato per eseguire una banale query xD continua mirracomando ^^
 
RE: Connessione ad un Database locale evitando l'origine dati (ODBC)

eh...il problema mi è sorto solo oggi pomeriggio,dato che voglio realizzare un bel programmino per connettere database di ogni tipo ed il problema principale (in ambiente windows) è proprio questo (che poi un vero problema non è ma per me è na grande seccatura...xD).In rete (in italiano) non ho trovato molto a riguardo e ho pensato che questa mini-guida sarebbe servirà a qualcuno probabilmente...^^
 
RE: Connessione ad un Database locale evitando l'origine dati (ODBC)

Davvero un gran bel progetto!!:) Fortunatamente hai a disposizione degli ottimi package che ti permettono la connessione a database quindi dovrebbe essere abbastanza semplice poterli gestire, la parte più complessa dovrebbe essere mettere insieme il tutto!!
 
RE: Connessione ad un Database locale evitando l'origine dati (ODBC)

Leggere dati da un database è semplice dato che si utilizzano oggetti di classe Connection,cambia solo il driver che viene caricato per leggere sul db.
 
RE: Connessione ad un Database locale evitando l'origine dati (ODBC)

Beh però siam curiosi di vedere in che modo interagisci con un qualsiasi tabella del database!! :)
 
RE: Connessione ad un Database locale evitando l'origine dati (ODBC)

bhe non è difficile.Ho creato una classe che si occupa di aprire/chiudere la connessione al DB,inoltre si occupa di effettuare query e update.Dopo aver aperto la connessione (con il metodo openConnection() citato sopra) per effettuare una query c'è il semplice metodo:
Codice:
public ResultSet query(String query){
        try{
            Statement stmt=con.createStatement(); 
            ResultSet rs=stmt.executeQuery(query);
            return rs;
        }catch(SQLException e){
            JOptionPane.showMessageDialog(null,"Interrogazione fallita: "+e.getMessage(),"Messaggio:",0,null); 
            closeConnection();
            return null;
        }
    }
Ritorna un'oggetto di classe ResultSet che contiene il risultato della query effettuata.Successivamente attraverso un'altro metodo (con lo stesso nome ma in una differente classe) prendo il ResultSet ed estraggo le informazioni in una JTable:
Codice:
public void query(String query){
        ArrayList ar=new ArrayList();
        
        try{
            ResultSet rs=(ResultSet)dbc.query(query);  
            if(rs.getRow()==-1){
                JOptionPane.showMessageDialog(this,"Il database è vuoto.");  
            }else{
                ResultSetMetaData rsmd = rs.getMetaData();
                int cols=rsmd.getColumnCount();
                colname=new String[cols];
                for(int i=0;i<cols;i++){
                   colname[i]=rsmd.getColumnName(i+1);
                }
                while(rs.next()){
                  for(int i=0;i<cols;i++){
                     String s=rs.getString(i+1);
                     if(s==null){s="";}
                     ar.add(s);
                  }
               }Object[][] cells;
               if(cols!=1){
                cells=new Object[cols][(ar.size()/cols)+1];
               }else{
                cells=new Object[cols][ar.size()];
               }
               int n1=0,n2=0;
               for(int i=0;i<ar.size();i++){
                  cells[n1][n2]=ar.get(i);
                  if(cols!=1){
                      if(n2/(cols-1)==0){
                          n2++;
                        }else{
                          n2=0;n1++;
                        }
                    }else{
                        n2++;
                    }
               }
               tb=new JTable(cells,colname);
               tb.getModel().addTableModelListener(this);
                tb.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
                     public void valueChanged(ListSelectionEvent event){
                         ListSelectionModel lsm=(ListSelectionModel)event.getSource();
                         if(lsm.isSelectionEmpty()){
                             System.out.println("No rows are selected.");
                            }else{
                                selectedRow=lsm.getMinSelectionIndex();
                                toRemove=""+tb.getValueAt(selectedRow,0);
                                del_rec.setEnabled(true);
                            }
                        }
                    }
                );

               sp.setHorizontalScrollBar(new JScrollBar());
               sp.setVerticalScrollBar(new JScrollBar());
               sp.getViewport().add(tb);
               repaint();
            }
         }catch(SQLException ee){
            JOptionPane.showMessageDialog(this,"Interrogazione fallita: " + ee.getMessage()); 
         }   
    }

il risultato è:
[img=500x300]http://img188.imageshack.us/img188/9203/tableab.jpg[/img]
 
Stato
Discussione chiusa ad ulteriori risposte.