如何检查值是否存在/为什么 ResultSet 在 SQLite 中关闭?

How do I check for value existence / why is ResultSet closed in SQLite?

设置

我正在为我的服务器数据库使用 JDBC SQLite

我想做什么

我想检查一个值(例如 IDusername)是否已经存在于 table。

我的代码

PreparedStatement preparedStatement = connection.prepareStatement("select * from " + tableName + " where " + columnName + "=? limit 1");
preparedStatement.setString(1, value);
ResultSet resultSet = preparedStatement.executeQuery();
resultSet.next();
try { // this was just for testing and is dumb because it prints an error every time the value does not exist.
      // my code actually wasn't wrong. I just tested it badly .. 
      // it's replacable with if (resultSet.next())
    resultSet.getString(1);
    System.out.println("check true");
    return true;
} catch (Exception e) {
    e.printStackTrace();
    System.out.println("check false");
    return false;
}

这里我想检查我的 table 中的 column(Name) 中是否已经存在特定的 value

问题

此代码将始终抛出 SQLException:"ResultSet closed" 在 resultSet.getString(columnName)。该值是否已存在于 table 中并不重要。我的查询也可能是错误的,因为我没有得到应该放在 select 之后的内容。我曾经在那里有一个 1,但每个人都在使用 * 作为 "all",但它没有任何改变。我真的不明白 this 因为它对我来说太复杂了,我只是想知道 select 之后的论点是什么..

方法

我尝试了很多东西并阅读了很多线程,但我遇到的唯一一件事是我需要先调用 resultSet.next()ResultSet 不会抛出 ResultSet closed 异常,但它没有改变任何东西。 如果有更好的方法来检查table中是否已经存在一个值,请告诉我。

可视化

我这里有一个 table(NULL 并不重要,它们可以是一些随机值),我想检查 ggffvgvg 是否存在。

完成 StackTrace

java.sql.SQLException: ResultSet closed
at org.sqlite.core.CoreResultSet.checkOpen(CoreResultSet.java:69)
at org.sqlite.core.CoreResultSet.markCol(CoreResultSet.java:96)
at org.sqlite.jdbc3.JDBC3ResultSet.getString(JDBC3ResultSet.java:436)
at Database.check(Database.java:50)
at ClientHandler.run(ClientHandler.java:72)

resultSet.next() returns 一个布尔值,告诉您是否有下一条记录。忽略这个 returned 值就像用火箭发射器射自己的脚一样。

因此,如果您要查找的值不在结果集中,(或者因为它确实不在,或者因为您没有正确请求它,)resultSet.next() will return false,并且您的代码 will 会因为您收到的异常而崩溃。

您的 resultSet.getString(1) 子句将获取结果集中的第一列(如果有当前行),它会 return 给您 假设它实际上是一个字符串。大多数表的第一列通常是一个整数,或一些其他类型的键数据类型,这意味着它很少是一个字符串。如果幸运的话,JDBC 驱动程序可以将其转换为字符串,但您假设这样做是在试探自己的命运。

如果您只想检查单个列的值,那么您的查询语句必须 select 只检查该列。这意味着而不是

"select * from " + tableName + " where " + columnName + "=? limit 1"

你必须做

"select " + columnName + " from " + tableName + " where " + columnName + "=? limit 1"

但是,如果我正确理解您要实现的目标,您甚至不需要获取该字段并检查其值。 resultSet.next()truefalse 结果就足够了。