Подтвердить что ты не робот

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

4b9b3361

Ответ 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) }
    }
}