我正在使用JDBC SQLite
作为我的服务器数据库。
我想检查一个表中是否已存在值(例如ID
或username
)。
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
例外,但它没有改变任何东西。
如果有更好的方法来检查表中是否已存在某个值,请告诉我。
我这里有一张表(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)
答案 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
结果即可。