2013-05-23 15 views
11

Ich hoffe jemand kann mir helfen. Ich arbeite an einer einfachen Anwendung, die sich mit einer SQLite-Datenbank verbindet. Folgendes ist mein Verbindungscode:Kein geeigneter Treiber gefunden (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()); 
} 

Dies ist nur ein Fenster zum Laden eines Benutzernamens und eines Kennworts in der Datenbank. Das Problem ist, dass ich, wenn ich auf die Schaltfläche klicken Sie auf die folgende Ausnahme angezeigt:

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

(ich ein Beispiel zu finden, wie zu einer SQLite-Datenbank in Java, das Beispiel, das ich gut funktioniert gefunden verbinden)

Dieses Programm mache ich im Fenster Builder (Eclipse). Ich verwende den gleichen Treiber, den ich in dem Beispiel verwende, das ich gefunden habe. Ich weiß nicht, ob ich einen anderen Treiber benutzen muss. In der Tat habe ich mit verschiedenen Treibern versucht, aber diese Nachricht erscheint immer noch.

+0

[Siehe hier JDBC PreparedStatement Beispiel] (http://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/) – Smit

+0

[JDBC + SQLite: Drivemanager nicht geladen werden benötigt Treiber] (http: //stackoverflow.com/questions/13637389/jdbc-sqlite-drivemanager-does-not-load-needed-driver) – Smit

+0

Das sieht nicht wie eine gültige URL aus. –

Antwort

17

Ihrem Klassenpfad fehlen die Jars, die die SQLite-Klassen und den Treiber enthalten. Sie benötigen etwas wie sqlite-jdbc-3.7.2.jar oder Ihre anwendbare Version.

Wenn Sie sicher sind, das Glas ist, versuchen Sie diese Codezeile hinzufügen, bevor Sie eine Verbindung zu erstellen:

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

es funktioniert nicht mit sqlite-jdbc-3.7.2.jar ... und wenn ich die Zeile "Class.forName (" org.sqlite.JDBC ");" ein Fehler in dieser Zeile mit dieser Nachricht angezeigt: "Unhandled Ausnahme Typ ClassNotFoundException" – Fenrir86

+0

@ Fenrir86 einfach umgeben es mit einem Versuch {....} catch (ClassNotFoundException e) {....} –

+0

Und stellen Sie sicher, dass Sie Habe die Datei sqlite-jdbc-xxxxxxx.jar in WEB-INF/lib/wenn du einen Server wie openshift betreibst –

2

Ich habe das gleiche Problem. I verwendet Maven und hinzugefügt Abhängigkeit:

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

Es kompiliert werden konnte, und ich bekam:

Keine passenden Treiber für jdbc gefunden: sqlite: xx.db

ich den Classpath Karo und ich war sicher sqlite-jdbc-3.15.1.jar war da. Ich denke, dass aus irgendeinem Grund die Klasse nicht geladen wurde, ich weiß nicht warum. so hinzugefügt I

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

am Anfang meines Codes. Es funktionierte!

Und ich lösche die Zeile oben. Es funktioniert noch! Ich habe das Projekt gereinigt und neu erstellt, es wird kein Class.forName() mehr benötigt !!! Ich weiß immer noch nicht warum. Aber das Problem ist gelöst. Ich denke, Class.forName() kann zur Diagnose verwendet werden, wenn die Klasse, die Sie benötigen, im Klassenpfad ist.

+0

für mich erscheint das Problem wieder beim Entfernen von 'Class.forName (" org.sqlite.JDBC ")' –

2

Es gibt mehr als nur Class.forName.

In dem Fall, dass Sie beide Dinge unten getan haben: - Die SQL-JL-Bibliothek Lib-Ordner unter Ihrem Projekt hinzugefügt, verweisen Sie darauf im Projekt Build-Pfad. - Anweisung Class.forName ("org.sqlite.JDBC") hinzugefügt. Und die Fehlermeldung "No suit driver" wird weiterhin angezeigt. Dies kann durch den Datenbankpfad verursacht werden. Wenn Sie Windows verwenden: Statt:

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

sollten Sie verwenden:

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

Die "jdbc: sqlite:" tut den Trick.

Wenn Sie Linux verwenden, ändern Sie einfach das Trennzeichen: DriverManager.getConnection ("jdbc: sqlite: /your/somepath/my-db.sqlite").

0

Die Zeile "Class.forName (" org.sqlite.JDBC ");" funktioniert, weil es eine Instanz von JDBC erstellt, die den statischen Block der Klasse JDBC auslösen:

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

Statt die Class.forName() der Zugabe oben erwähnt, können Sie direkt auf diese Linie, die die gleiche Wirkung hat verwenden sollten, und dass elegantere ist (weil Sie keine Instanz von JDBC für nichts erstellen):

DriverManager.registerDriver(new JDBC()); 
0

Wenn Sie eine ausführbare jar bauen verwenden Maven und möchten, können Sie den Inhalt des sQLite-Glas in Ihrem importieren entscheiden eigenes produziertes Glas:

<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> 

Sie müssen keinen spezifischen Klassenpfad oder eine implizite Verwendung hinzufügen, wie in den anderen Antworten vorgeschlagen.

Verwandte Themen