Запуск SELECT для определенного столбца, который совпадает с вводом из функции kotlin, выбрасывает нулевой указатель - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь написать метод, который принимает имя пользователя в качестве входных данных и создает инструкцию SQL-запроса, которая затем выполняется. На данный момент я получаю NullPointer, когда пытаюсь позвонить result.getObject().

Вот мой метод динамического создания оператора SQL:

fun getByUsername(name: String): User?{
    val sql = """SELECT * FROM usertable WHERE username="$name";"""
    val result = DatabaseController().trySql(sql)
    if (result != null) {
        if (!result.isBeforeFirst) {
            println("User was not found...")
            return null
        } else {
            println("User found....")
            return User(result.getObject("username").toString(),
                    result.getObject("password").toString(),
                    result.getObject("admin").toString().toBoolean())
        }
    }
    return null
}

Метод, который выполняет запрос:

fun trySql(sqlCommand: String): ResultSet? {
    var conn = this.connect()
    println("trySql()-------Running query $sqlCommand")
    var result = conn?.createStatement()?.executeQuery(sqlCommand)
    conn?.close()
    return result
}

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

EDIT

Если я просто верну result в trySql(), я больше не получу никаких ошибок, но после чтения я должен закрыть соединения после использования?

1 Ответ

0 голосов
/ 04 мая 2018

Почему у вас проблемы

Вы закрываете соединение, из-за чего ResultSet, который вы получаете, больше не нужен. У вас будет доступ к объекту результата, но объект результата не сможет прочитать данные из SQLite, что приведет к ошибкам.

Как исправить

Вы можете передать некоторый код в вашу функцию trySql, которая будет выполняться при открытом соединении, а затем закрыться после пропущенного блока.

Пример

Библиотека

class Con(val con: Connection = DriverManager.getConnection(URL)): AutoCloseable by con {
    fun <T> withSQL(query: String, block: (ResultSet)->T): T {
        con.createStatement().use { statement ->
            statement.executeQuery(query).use { results ->
                return block(results)
            }
        }
    }
}

Использование

Con().use { con ->
    val result: Int = con.withSQL("SELECT * from example WHERE name='test'") {
        it.getInt(1)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...