无法连接数据库(未找到合适的驱动程序)

问题描述 投票:0回答:8

我的连接代码:

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" 

我找到了一个如何用 Java 连接到 SQLite 数据库的示例,效果很好。我在 WindowBuilder (Eclipse) 中使用示例中的相同驱动程序执行此操作。我尝试了不同的驱动程序,但该消息仍然出现。

java eclipse sqlite windowbuilder
8个回答
60
投票

您的类路径缺少包含 sqlite 类和驱动程序的 jar。您需要类似 sqlite-jdbc-3.7.2.jar 或您适用的版本。

如果您确定 jar 在那里,请尝试在创建连接之前添加此行代码:

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

17
投票

我也遇到了同样的问题。 我使用了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() 可以用于诊断您需要的类是否在类路径中。


6
投票

还要检查您的数据库连接字符串引用现有数据库。

如果您:

  • 将 sqlite jar 库添加到项目下的 lib 文件夹中,在项目构建路径中引用它。
  • 添加了 Class.forName("org.sqlite.JDBC") 语句。

如果错误消息“Nosuit driver”仍然出现,很可能是由您的数据库路径不正确引起。检查路径是否存在。

引用现有数据库文件的格式正确的连接字符串:

Windows

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

Linux

DriverManager.getConnection("jdbc:sqlite:/your/somepath/my-db.sqlite").

2
投票

如果您使用 Maven 并想要构建可执行 jar,您可以决定将 sqlite jar 的内容导入到您自己生成的 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>

您不必按照其他答案中的建议添加特定的类路径或隐式用法。


2
投票

下面是中央存储库的链接,您可以从中下载最新的驱动程序文件。

https://repo1.maven.org/maven2/org/xerial/sqlite-jdbc/

确保下载 sqlite-jdbc-version.jar 文件而不是其他文件。 希望这会有所帮助


0
投票

我使用简单的 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) }
    }
}

0
投票

3.7.2版本的问题尝试安装3.21.0吧


0
投票

我对 sqlite-jdbc-3.45.3.0.jar 也有同样的问题 我解决了它添加 slf4j-api-1.7.36.jar 因为这就是“用法”部分中提到他的文档的方式。检查:在此处输入链接描述

© www.soinside.com 2019 - 2024. All rights reserved.