找不到合适的驱动程序(SQLite)

时间:2013-05-23 23:11:46

标签: java eclipse sqlite windowbuilder

我希望有人可以帮助我。我正在开发一个与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" 

(我找到了一个关于如何使用Java连接到SQLite数据库的示例,我发现的示例效果很好)

这个程序我在窗口构建器(eclipse)中这样做。我使用的是我在我找到的示例中使用的相同驱动程序。我不知道是否必须使用其他驱动程序。事实上,我尝试过不同的驱动程序,但仍然会显示该消息。

7 个答案:

答案 0 :(得分:27)

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

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

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

答案 1 :(得分:4)

我遇到了同样的问题。 我使用了maven并添加了依赖:

{
  "compilerOptions": {
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": [
      "es2015",
      "es2015.reflect",
      "dom"
    ],
    "declaration": false,
    "inlineSources": true,
    "module": "commonjs",
    "moduleResolution": "node",
    "newLine": "LF",
    "noImplicitAny": false,
    "removeComments": true,
    "sourceMap": true,
    "strictNullChecks": true,
    "target": "es5"
  },
  "files": [
    "src/index.ts"
  ],
  "include": [
    "typings/index.d.ts"
  ]
}

它可以编译,我得到了:

找不到合适的jdbc驱动程序:sqlite:xx.db

我检查了类路径,我确信sqlite-jdbc-3.15.1.jar就在那里。 我想由于某种原因,Class没有加载,我不知道为什么。 所以我添加了

的Class.forName( “org.sqlite.JDBC”);

在我的代码的开头。它奏效了!

而且,我删除了上面的一行。它仍然有效!我清理了项目并重建它,不再需要Class.forName()!我还是不知道为什么。但问题解决了。我认为Class.forName()可以用于诊断,如果你需要的类在类路径中。

答案 2 :(得分:3)

不仅仅是Class.forName。

如果你做了以下两件事: - 将sqlite jar库添加到项目下的lib文件夹中,在项目构建路径中引用它。 - 添加了Class.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:源码:/your/somepath/my-db.sqlite")。

答案 3 :(得分:3)

该行" 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());

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

如果您使用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>

您不必像其他答案中那样添加特定的类路径或隐式用法。

答案 6 :(得分: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文件以及源文件中包含所有从属库,以创建一个胖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) }
    }
}