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

34

我的连接代码:

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)中进行此操作,使用与示例相同的驱动程序。我尝试了不同的驱动程序,但该消息仍然出现。


请点击此处查看JDBC PreparedStatement示例:http://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/ - Smit
这看起来不像是一个有效的网址。 - Sotirios Delimanolis
7个回答

59

您的类路径缺少包含SQLite类和驱动程序的jar文件。您需要类似于sqlite-jdbc-3.7.2.jar或相应版本的jar文件。

如果您确定jar文件已经存在,请在创建连接之前尝试添加以下代码行:

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

3
它不能与sqlite-jdbc-3.7.2.jar一起使用...如果我添加"Class.forName("org.sqlite.JDBC");"这行代码,会出现一个错误,错误信息为:"Unhandled exception type ClassNotFoundException"。 - Fenrir86
1
@Fenrir86 只需将其放在 try{ .......}catch(ClassNotFoundException e){ ....} 中即可。 - Michael Kern
请确保在运行像openshift这样的服务器时,您在WEB-INF/lib/中拥有sqlite-jdbc-xxxxxxx.jar文件。 - Michael Kern
有趣的是,在我构建为Macintosh应用程序包的应用程序中,我不需要这行代码。但是其他平台使用的可执行jar文件需要它。我不知道为什么,但了解两个平台之间的行为差异是很好的。 - MiguelMunoz
我遇到了同样的问题,与 sqlite-jbdc-3.7.2 有关。我已经切换到 "org.xerial:sqlite-jdbc:3.8.11"(使用 gradle),现在它可以正常工作了。 - Chamlal
这个答案真的帮了我,我把sqlite-jdbc-xxx.jar放在WEB-INF/lib/目录下,然后出现了异常。但是Class.forName("org.sqlite.JDBC");是做什么的,为什么它解决了问题。有人能解释一下吗... - undefined

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()可用于诊断您所需的类是否在类路径中。


当我删除 Class.forName("org.sqlite.JDBC") 时,问题再次出现。 - Andre Holzner
我已经安装了依赖项,但仍然看到错误。将版本更新为3.30.1后问题得到解决。 - Malcolm Crum

6

同时检查您的数据库连接字符串是否引用了现有的数据库。

在以下情况下:

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

如果仍然出现“没有合适的驱动程序”错误消息,则很可能是由于您的不正确的数据库路径导致的。请检查该路径是否存在。

引用现有db文件的正确格式化的连接字符串:

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

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版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接