Проблема вставки данных в базу данных sqlite с помощью JDBC - PullRequest
0 голосов
/ 26 апреля 2018

Вот как выглядит мой код:

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, которые запрашивают данные («SELECT»), которые все работают правильно, но каждый раз, когда я пытаюсь выполнить какое-либо обновление информации, мне выдается одна и та же ошибка. Я в растерянности из-за того, что делать в данный момент, просмотрев множество различных форумов и сообщений о синтаксисе и тому подобном.

Полная трассировка стека выглядит следующим образом:

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, создающим новую строку в таблице. Я просто не знаю, как отладить эту конкретную проблему.

1 Ответ

0 голосов
/ 27 апреля 2018

Так что это была большая проблема для меня на прошлой неделе или около того, и похоже, что мне удалось выяснить проблему.

Мне известно, что вы должны обязательно закрыть все соединения с базой данных, прежде чем открывать новую, чтобы избежать блокировок и других подобных проблем. Чего я не понял, так это того, что я использовал программу на IntelliJ под названием «DB Browser». Этот плагин создает пользовательский интерфейс, который намного легче позволяет вам получить доступ и изменить любой аспект базы данных, который вы хотите, без использования реальных команд SQL. Чего я не понял, так это того, что этот плагин использует единственное доступное для записи соединение, которое SQLite и JDBC разрешают к базе данных.

Итак, после удаления подключения к базе данных через плагин DB Browser все мои функции работают нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...