设置
我正在使用 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
异常,但它没有改变任何东西。
如果有更好的方法来检查表中是否已存在值,请告诉我。
可视化
我这里有一个表(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()
的 true
或 false
结果就足够了。
关于java - 如何检查值是否存在/为什么 ResultSet 在 SQLite 中关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41793478/