我希望有人可以帮助我。我正在开发一个与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)中这样做。我使用的是我在我找到的示例中使用的相同驱动程序。我不知道是否必须使用其他驱动程序。事实上,我尝试过不同的驱动程序,但仍然会显示该消息。
答案 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) }
}
}