2013-05-23 16 views
11

Spero che qualcuno possa aiutarmi. Sto lavorando su una semplice applicazione che si connette con un database SQLite. Di seguito è riportato il mio codice di connessione:Nessun driver adatto trovato (SQLite)

try {   
    Connection con = DriverManager.getConnection("jdbc:sqlite:myDB.sqlite"); 
    PreparedStatement pstm = con.prepareStatement("insert into hell(username,pssword) " + 
"values ('"+tfUname.getText()+"','"+tfUpass.getText()+"')"); 

    pstm.close(); 
    con.close(); 
    JOptionPane.showMessageDialog(null,"Congrats, you have been registered succesfully"); 
    RegisterWindow rw = new RegisterWindow(); 
    rw.setVisible(false); 
    pack(); 
    dispose(); 
} catch(SQLException ex) { 
    setTitle(ex.toString()); 
} 

Questa è solo una finestra per caricare un nome utente e una password nel database. Il problema che ho è che quando faccio clic sul pulsante appare la seguente eccezione:

"java.sql.SQLException: No suitable driver found for jdbc:sqlite:C\\LoginJava2\\myDB.sqlite" 

(ho trovato un esempio su come connettersi a un database SQLite in Java, l'esempio che ho trovato funziona bene)

Questo programma lo sto facendo in window builder (eclipse). Sto usando lo stesso driver che uso nell'esempio che ho trovato. Non so se devo usare un altro driver. In effetti, ho provato con driver diversi ma quel messaggio appare ancora.

+0

[Vedi qui JDBC PreparedStatement Example] (http://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/) – Smit

+0

[JDBC + SQLite: DriveManager non carica il driver necessario] (http: //stackoverflow.com/questions/13637389/jdbc-sqlite-drivemanager-does-not-loadedne-driver) – Smit

+0

Questo non sembra un URL valido. –

risposta

17

Nel classpath mancano i jar che contengono le classi e il driver sqlite. Hai bisogno di qualcosa come sqlite-jdbc-3.7.2.jar o la tua versione applicabile.

Se sei sicuro che il vaso è lì, prova ad aggiungere questa riga di codice prima di creare una connessione:

Class.forName("org.sqlite.JDBC"); 
+2

non funziona con sqlite-jdbc-3.7.2.jar ... e se aggiungo la riga "Class.forName (" org.sqlite.JDBC ");" appare un errore in quella riga con questo messaggio: "Tipo eccezione non gestita ClassNotFoundException" – Fenrir86

+0

@ Fenrir86 semplicemente circondarlo con un try {.......} catch (ClassNotFoundException e) {....} –

+0

E assicurati di avere il file sqlite-jdbc-xxxxxxx.jar in WEB-INF/lib/se si sta eseguendo un server come openshift –

2

ho avuto lo stesso problema. Ho usato Maven e la dipendenza aggiunto:

<dependency> 
     <groupId>org.xerial</groupId> 
     <artifactId>sqlite-jdbc</artifactId> 
     <version>3.15.1 
     </version> 
    </dependency> 

Potrebbe essere compilato ed ho ottenuto:

Nessun driver adatto trovato per JDBC: sqlite: xx.db

ho controllato il percorso di classe ed ero certo sqlite-jdbc-3.15.1.jar era lì. Immagino che per qualche motivo, la Classe non sia stata caricata, non so perché. così ho aggiunto

Class.forName ("org.sqlite.JDBC");

all'inizio del mio codice. Ha funzionato!

E, cancellare la riga sopra. Funziona ancora! Ho pulito il progetto e lo ho ricostruito, non è più necessario Class.forName() !!! Non so ancora perché. Ma il problema è risolto. Penso che Class.forName() possa essere usato per diagnosticare se la classe di cui hai bisogno è nel classpath.

+0

per me il problema si presenta nuovamente quando si rimuove 'Class.forName (" org.sqlite.JDBC ")' –

2

C'è qualcosa in più rispetto a Class.forName.

Nel caso in cui entrambe le cose siano state eseguite di seguito: - È stata aggiunta la libreria del contenitore sqlite alla cartella lib del progetto, facendo riferimento ad essa nel percorso di generazione del progetto. - Aggiunta dell'istruzione Class.forName ("org.sqlite.JDBC"). E il messaggio di errore "Nessun driver adatto" viene ancora visualizzato, potrebbe essere causato dal percorso del database. Se si utilizza Windows: Invece di:

DriverManager.getConnection("D:\\db\\my-db.sqlite"). 

Si dovrebbe usare:

DriverManager.getConnection("jdbc:sqlite:D:\\db\\my-db.sqlite"). 

Il "jdbc: sqlite:" farà il trucco.

Se si utilizza Linux, basta cambiare il carattere separatore: DriverManager.getConnection ("jdbc: sqlite: /your/somepath/my-db.sqlite").

0

La riga "Class.forName (" org.sqlite.JDBC ");" funziona perché crea un'istanza di JDBC che innescano il blocco statico della JDBC classe:

static { 
     try { 
      DriverManager.registerDriver(new JDBC()); 
     } 
     catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

Invece di aggiungere il Class.forName() di cui sopra, si consiglia di utilizzare direttamente questa linea che ha lo stesso effetto e che è più elegante (perché non si crea un'istanza di JDBC per niente):

DriverManager.registerDriver(new JDBC()); 
0

Se si utilizza Maven e vuole costruire un jar eseguibile, si potrebbe decidere di importare il contenuto del vaso SQLite nella vostra barattolo prodotto:

<plugins> 
    <!-- any other plugins --> 
    <plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <executions> 
     <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <archive> 
     <manifest> 
      <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
      <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries> 
      <addClasspath>true</addClasspath> 
      <mainClass>MyPackage.Main</mainClass> 
     </manifest> 
     </archive> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
    </configuration> 
    </plugin> 
</plugins> 

Non sarà necessario aggiungere un percorso di classe specifico o un uso implicito come proposto nelle altre risposte.

Problemi correlati