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

标签 java sqlite jdbc resultset

设置

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

我正在尝试做什么

我想检查表中是否已存在某个值(例如 ID用户名)。

我的代码

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;
}

在这里,我想检查列(Name)中是否已存在特定的

问题

此代码将始终在 resultSet.getString(columnName) 处抛出 SQLException:“ResultSet 已关闭”。该值是否已存在于表中并不重要。我的查询也可能是错误的,因为我没有得到应该在 select 之后放置的内容。我曾经有一个 1 ,但每个人都使用 * 表示“全部”,但它没有改变任何东西。我真的不明白this因为它对我来说太复杂了,我只是想知道 select 之后的参数是做什么的..

方法

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

可视化

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

完整的堆栈跟踪

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() 返回一个 boolean 值,告诉您是否有下一条记录。忽略这个返回值就像用火箭发射器搬起石头砸自己的脚。

因此,如果您要查找的值不在结果集中(要么因为它确实不在,要么因为您没有正确要求它),resultSet.next() 返回false,并且您的代码崩溃,但您收到的异常除外。

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

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

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

你必须这样做

“从“+表名+”中选择“+列名+”,其中“+列名+”=?限制1”

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

关于java - 如何检查值是否存在/为什么 ResultSet 在 SQLite 中关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41793478/

相关文章:

java - 查询解决方案,保留 "< >"

java - 在 Java 中创建自定义事件

iphone - 如何在 iPhone 应用更新时更新 SQLite 数据库?

database - 将包含 2 个表的 CSV 转换为 SQLite

java - JDBC,连接正常但不执行查询

java - 为 Java 中的每个小功能创建一个方法是否会降低性能?

java - 仍然无法创建该表。问题是什么?

sqlite - 如何获取列>X中值的比例?

java - JDBC 返回生成的键或现有的键

java - 在 JDBC 中编写 SQL 查询的最佳实践是什么