如何检查值是否存在/为什么 ResultSet 在 SQLite 中关闭?
How do I check for value existence / why is ResultSet closed in SQLite?
设置
我正在为我的服务器数据库使用 JDBC SQLite
。
我想做什么
我想检查一个值(例如 ID
或 username
)是否已经存在于 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()
的 true
或 false
结果就足够了。
设置
我正在为我的服务器数据库使用 JDBC SQLite
。
我想做什么
我想检查一个值(例如 ID
或 username
)是否已经存在于 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中是否已经存在一个值,请告诉我。
可视化
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()
的 true
或 false
结果就足够了。