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

时间:2017-01-22 16:40:42

标签: java sqlite jdbc resultset

设置

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

我想做什么

我想检查一个表中是否已存在值(例如IDusername)。

我的代码

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

在此,我想检查value中我的column(Name)中是否已存在特定的table

问题

此代码将始终在SQLException处抛出resultSet.getString(columnName):“ResultSet已关闭”。表中是否已存在该值无关紧要。我的查询也可能是错误的,因为我在select之后没有得到我应该放的东西。我曾经有一个1,但是每个人都使用*代表“所有”而且它没有任何变化。我真的没有得到this,因为它对我来说太复杂了,我只是想知道select之后的论点是什么。

途径

我尝试了很多东西,并阅读了很多主题,但我遇到的唯一问题是我需要先调用resultSet.next()并且ResultSet不会抛出ResultSet closed例外,但它没有改变任何东西。 如果有更好的方法来检查表中是否已存在某个值,请告诉我。

可视化

a 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)

1 个答案:

答案 0 :(得分:2)

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

因此,如果您要查找的值不在结果集中(或者因为它确实不是,或者因为您没有正确地要求它),resultSet.next() 返回false,您的代码 会爆炸,但您收到的例外情况。

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

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

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

你必须做

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

但是,如果我正确理解您要实现的目标,您甚至不需要获取该字段并检查其值。只需true的{​​{1}}或false结果即可。