Не найден подходящий драйвер (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:CLoginJava2myDB.sqlite" 

(Я нашел пример о том, как подключиться к базе данных SQLite в Java, пример, который я нашел работает хорошо)

эта программа Я делаю это в window builder (eclipse). Я использую тот же драйвер, что и в Примере, который я нашел. Я не знаю, должен ли я использовать другого водителя. На самом деле, я пробовал с разными драйверами, но это сообщение все равно появляется.

6 ответов


в пути к классам отсутствуют jar(ы), содержащие классы sqlite и драйвер. Вам нужно что-то вроде sqlite-jdbc-3.7.2.jar или ваша применимая версия.

Если вы уверены, что jar есть, попробуйте добавить эту строку кода перед созданием соединения:

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

У меня такая же проблема. Я использовал 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.Джар был там. Я думаю, что по какой-то причине класс не был загружен, я не знаю, почему. поэтому я добавил

класса.forName ("org.базы данных SQLite.JDBC");

в начале моего кода. Он работал!

и , Я удаляю строку выше. Он все еще работает! Я очистил проект и перестроил его, больше никакого класса.forName() необходим!!! Я до сих пор не знаю, почему. Но проблема решена. Думаю, класс.forName () может использоваться для диагностики, если необходимый класс находится в пути к классам.


есть что-то большее, чем просто класс.forName.

в случае, если вы сделали и то ниже: - Добавлена библиотека SQLite jar в папку lib под вашим проектом, ссылка на него в пути сборки проекта. - Добавлен Класс.forName ("org.базы данных SQLite.В JDBC") заявление. И сообщение об ошибке" нет драйвера костюма " все еще появляется, его может быть вызвано вашим путем к базе данных. Если вы используете Windows: Вместо:

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

вы должны использовать:

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

" jdbc:sqlite: "будет сделать трюк.

Если вы используете Linux, просто измените символ разделителя: DriverManager.метод getconnection("JDBC в:данных SQLite:/ваш/somepath/мой-дБ.данных SQLite").


строка " класс.forName ("org.базы данных SQLite.JDBC"); " работает, потому что он создает экземпляр JDBC, который запускает статический блок класса JDBC:

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

вместо добавления класса.forname (), упомянутый выше, вы должны напрямую использовать эту строку, которая имеет тот же эффект и которая более элегантна (потому что вы не создаете экземпляр JDBC бесплатно):

DriverManager.registerDriver(new JDBC());

Если вы используете Maven и хотите создать исполняемый jar, вы можете решить импортировать содержимое jar sqlite в свой собственный jar:

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

вам не нужно будет добавлять определенный путь к классам или неявное использование, как предложено в других ответах.


я столкнулся с аналогичными проблемами, используя простую конфигурацию 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 build создавал jar, который не включал никаких внешних зависимостей. Следующая конфигурация должна использоваться для включения всех ваших зависимых библиотек в результирующий файл 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) }
    }
}