Не найдено подходящего драйвера (SQLite)
Надеюсь, кто-то может мне помочь. Я работаю над простым приложением, которое соединяется с базой данных 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());
}
Это просто окно для загрузки имени пользователя и пароля в базу данных. Проблема в том, что при нажатии кнопки появляется следующее исключение:
"java.sql.SQLException: No suitable driver found for jdbc:sqlite:C\\LoginJava2\\myDB.sqlite"
(я нашел пример того, как подключиться к базе данных SQLite в Java, пример, который я нашел, работает хорошо)
Эта программа я делаю это в window builder (eclipse). Я использую тот же самый драйвер, который я использую в примере, который я нашел. Я не знаю, должен ли я использовать другой драйвер. На самом деле, я пробовал с разными драйверами, но это сообщение все еще появляется.
Ответы
Ответ 1
В вашем пути к классу отсутствует jar (s), которые содержат классы и драйверы sqlite. Вам нужно что-то вроде sqlite-jdbc-3.7.2.jar или вашей применимой версии.
Если вы уверены, что там есть jar, попробуйте добавить эту строку кода перед созданием соединения:
Class.forName("org.sqlite.JDBC");
Ответ 2
У меня такая же проблема.
Я использовал maven и добавил зависимость:
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.15.1
</version>
</dependency>
Он может быть скомпилирован, и я получил:
Не найдено подходящего драйвера для jdbc: sqlite: xx.db
Я проверил путь к классам, и я был уверен, что там был sqlite-jdbc-3.15.1.jar.
Я думаю, что по какой-то причине класс не был загружен, я не знаю, почему.
поэтому я добавил
Class.forName( "org.sqlite.JDBC" );
в начале моего кода. Это сработало!
И я удаляю строку выше. Он по-прежнему работает! Я очистил проект и перестроил его, больше не требуется Class.forName()!!! Я все еще Не знаю, почему. Но проблема решена. Я думаю, что Class.forName() можно использовать для диагностики, если класс, в котором вы нуждаетесь, находится в пути к классам.
Ответ 3
Есть нечто большее, чем просто Class.forName.
В случае, если вы сделали две вещи ниже:
- Добавлена библиотека sqlite jar в папку lib по вашему проекту, ссылка на нее в пути построения проекта.
- Добавлен оператор Class.forName( "org.sqlite.JDBC" ).
И сообщение об ошибке "No suit driver" все еще появляется, это может быть вызвано вашим пути к базе данных.
Если вы используете Windows:
Вместо:
DriverManager.getConnection("D:\\db\\my-db.sqlite").
Вы должны использовать:
DriverManager.getConnection("jdbc:sqlite:D:\\db\\my-db.sqlite").
"jdbc: sqlite:" выполнит трюк.
Если вы используете Linux, просто измените символ seperator:
DriverManager.getConnection( "JDBC: SQLite:/your/somepath/my-db.sqlite" ).
Ответ 4
Строка Class.forName("org.sqlite.JDBC");
работает, потому что создает экземпляр JDBC, который запускает статический блок класса JDBC:
static {
try {
DriverManager.registerDriver(new JDBC());
}
catch (SQLException e) {
e.printStackTrace();
}
}
Вместо добавления вышеупомянутого Class.forname()
вы должны напрямую использовать эту строку, которая имеет тот же эффект и является более элегантной (потому что вы знаете и понимаете, почему вы создаете экземпляр JDBC):
DriverManager.registerDriver(new JDBC());
Ответ 5
Если вы используете Maven и хотите создать исполняемую банку, вы можете решить импортировать содержимое баннера sqlite в свою собственную банку:
<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>
Вам не нужно добавлять определенный путь к классам или неявное использование, как было предложено в других ответах.
Ответ 6
Я столкнулся с похожими проблемами, используя простую конфигурацию Gradle следующим образом
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'
}
}
Позже я обнаружил, что сборка Gradle создала флягу, которая не включала никаких внешних зависимостей. Следующая конфигурация должна использоваться для включения всех ваших зависимых библиотек в результирующий файл jar вместе с вашими исходными файлами для создания 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) }
}
}