这就是我的代码目前的样子:
import java.sql.*
import java.sql.SQLException
class SqliteDB {
val conn = DriverManager.getConnection("jdbc:sqlite:cs2820-database.db")
fun createUser123(userID: String, password: String, adminStatus: String) {
val statement = conn.prepareStatement("INSERT INTO Users(id,pass,admin) VALUES(?,?,?)")
statement.setString(1, userID)
statement.setString(2,password)
statement.setString(3,adminStatus)
println("123")
statement.executeUpdate()
conn.commit()
println("User Created")
}
// create a user
fun createUser(userID: String, password: String, adminStatus: String) {
println("inside createUser")
val sql = "INSERT INTO Users(id,pass,admin) VALUES(?,?,?)"
Class.forName("org.sqlite.JDBC")
try {
conn.use { conn ->
conn.prepareStatement(sql).use { pstmt ->
pstmt.setString(1, userID)
pstmt.setString(2, password)
pstmt.setString(3, adminStatus)
pstmt.executeUpdate()
//conn.commit()
pstmt.close()
}
}
} catch (e: SQLException) {
println(e.message)
}
}
fun main(args: Array<String>) {
val db = SqliteDB()
db.createUser("Jim", "password", "false")
}
我测试了两种不同的createUser
方法,我尝试过的大多数都会返回错误[SQLITE_BUSY]数据库文件被锁定(数据库被锁定)。我在同一个SqliteDB类中有几个其他方法查询数据(&#34; SELECT&#34;),它们都正常工作,但每次我尝试执行任何类型的信息更新时,我都会得到同样的错误。在这一点上我搜索了许多不同的论坛和关于语法等的帖子,我感到很茫然。
完整的堆栈跟踪如下:
Exception in thread "main" org.sqlite.SQLiteException: [SQLITE_BUSY] The database file is locked (database is locked)
at org.sqlite.core.DB.newSQLException(DB.java:909)
at org.sqlite.core.DB.newSQLException(DB.java:921)
at org.sqlite.core.DB.execute(DB.java:822)
at org.sqlite.core.DB.executeUpdate(DB.java:863)
at org.sqlite.jdbc3.JDBC3PreparedStatement.executeUpdate(JDBC3PreparedStatement.java:99)
at SqliteDB.createUser(SqliteDB.kt:50)
at SqliteDBKt.main(SqliteDB.kt:122)
我不相信问题是打开连接,因为一旦我尝试执行对User表的更新,似乎就会发生错误。插入似乎在执行阶段遇到某种类型的循环。
编辑:我注意到的其他事情是,当尝试使用已存在的主键(userID)创建新用户时,我会收到一个唯一性错误,建议更新通过并且实现userID已经在表中;但是,INSERT在表格中创建 new 行仍然存在问题。我只是不确定如何调试该特定问题。
答案 0 :(得分:0)
在过去一周左右的时间里,这对我来说是个问题,看起来我已经能够找出问题了。
我知道您必须确保在打开新数据库之前关闭与数据库的任何连接以避免锁定和任何其他类似问题。我没有意识到的是我一直在IntelliJ中使用一个名为“DB Browser”的程序。此插件创建一个UI,使您可以更轻松地访问和更改所需数据库的任何方面,而无需使用实际的SQL命令。我没有意识到这个插件占用了SQLite和JDBC允许数据库的唯一可写连接。
因此,在通过数据库浏览器插件删除与数据库的连接后,我的所有功能都正常工作。