J'espère que quelqu'un pourra m'aider. Je travaille sur une application simple qui se connecte à une base de données SQLite. Voici mon code de connexion:
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());
}
Ceci est juste une fenêtre pour charger un nom d'utilisateur et un mot de passe dans la base de données. Le problème que j'ai, c'est que lorsque je clique sur le bouton, l'exception suivante apparaît:
"Java.sql.SQLException: No suitable driver found for jdbc:sqlite:C\\LoginJava2\\myDB.sqlite"
(J'ai trouvé un exemple sur la façon de se connecter à une base de données SQLite en Java, l'exemple que j'ai trouvé fonctionne bien)
Ce programme je le fais dans le constructeur de fenêtre (Eclipse). J'utilise le même pilote que dans l'exemple que j'ai trouvé. Je ne sais pas si je dois utiliser un autre pilote. En fait, j'ai essayé avec différents pilotes mais ce message apparaît toujours.
Votre chemin d'accès aux classes ne contient pas le ou les fichiers jar contenant les classes et le pilote SQLite. Vous avez besoin de quelque chose comme sqlite-jdbc-3.7.2.jar ou votre version applicable.
Si vous êtes sûr que le fichier jar est présent, essayez d'ajouter cette ligne de code avant de créer une connexion:
Class.forName("org.sqlite.JDBC");
J'ai eu le même problème ... J'ai utilisé maven et ajouté des dépendances:
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.15.1
</version>
</dependency>
Il pourrait être compilé et j'ai eu:
Aucun pilote approprié trouvé pour jdbc: sqlite: xx.db
J'ai vérifié le chemin de la classe et j'étais sûr que sqlite-jdbc-3.15.1.jar était là… .. Je suppose que pour une raison quelconque, la classe n'était pas chargée, je ne sais pas pourquoi… .. alors j'ai ajouté
Class.forName ("org.sqlite.JDBC");
au début de mon code. Ça a marché!
Et je supprime la ligne ci-dessus. Ça fonctionne encore! J'ai nettoyé le projet et le reconstruit, plus besoin de Class.forName () !!! Je ne sais toujours pas pourquoi. Mais le problème est résolu. Je pense que Class.forName () peut être utilisé pour diagnostiquer si la classe dont vous avez besoin est dans le classpath.
Il y a quelque chose de plus que Class.forName.
Dans le cas où vous avez effectué les deux opérations ci-dessous: - A ajouté la bibliothèque jar sqlite au dossier lib de votre projet, avec référence dans le chemin de construction du projet .- A ajouté Class.forName ("org.sqlite.JDBC" ) déclaration . Et le message d'erreur "No suit driver" apparaît toujours, cela peut être causé par le chemin de votre base de données . Si vous utilisez Windows: Au lieu de:
DriverManager.getConnection("D:\\db\\my-db.sqlite").
Tu devrais utiliser:
DriverManager.getConnection("jdbc:sqlite:D:\\db\\my-db.sqlite").
Le "jdbc: sqlite:" fera l'affaire.
Si vous utilisez Linux, changez simplement le caractère séparateur: DriverManager.getConnection ("jdbc: sqlite: /your/somepath/my-db.sqlite").
La ligne "Class.forName (" org.sqlite.JDBC ");" fonctionne car il crée une instance de JDBC qui déclenche le bloc statique de la classe JDBC:
static {
try {
DriverManager.registerDriver(new JDBC());
}
catch (SQLException e) {
e.printStackTrace();
}
}
Au lieu d'ajouter le Class.forname () mentionné ci-dessus, vous devriez utiliser directement cette ligne qui a le même effet et qui est plus élégante (car vous ne créez pas d'instance de JDBC pour rien):
DriverManager.registerDriver(new JDBC());
Si vous utilisez Maven et souhaitez créer un fichier jar exécutable, vous pouvez importer le contenu du fichier jar sqlite dans votre propre fichier jar produit:
<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>
Vous n’aurez pas à ajouter de chemin de classe spécifique ni d’utilisation implicite comme proposé dans les autres réponses.
Je faisais face à des problèmes similaires en utilisant une configuration simple gradle comme suit
apply plugin: 'Java'
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.Apache.commons', name: 'commons-lang3', version: '3.0'
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.2.0'
compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.23.1'
}
jar {
manifest {
attributes 'Main-Class': 'rewards.simulator.MainSimulator'
}
}
J'ai plus tard découvert que la construction de Gradle créait un fichier jar qui n'incluait aucune dépendance externe. La configuration suivante doit être utilisée pour inclure toutes vos bibliothèques dépendantes dans le fichier JAR résultant, ainsi que vos fichiers source, afin de créer un fichier fat-jar:
apply plugin: 'Java'
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.Apache.commons', name: 'commons-lang3', version: '3.0'
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.2.0'
compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.23.1'
}
jar {
manifest {
attributes 'Main-Class': 'rewards.simulator.MainSimulator'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}