首页 > 解决方案 > 在与来自 kotlin 函数的输入匹配的特定列上运行 SELECT,会抛出空指针

问题描述

我正在尝试编写一个将用户名作为输入的方法,并创建一个 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
}

我运行它的用户名也在我的表中,所以这不是问题。我在表中创建一行的方法工作正常,所以我知道连接到数据库没有问题。

编辑

如果我只是返回resulttrySql()我不再收到任何错误,但从我的阅读来看,我应该在使用后关闭连接吗?

标签: sqlitekotlin

解决方案


为什么你有问题

您正在关闭连接,这会使您返回的 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)
    }
}

推荐阅读