【发布时间】:2017-06-07 04:52:26
【问题描述】:
设置
我正在为我的服务器数据库使用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;
}
在这里,我想检查我的column(Name) 中的table 中是否已经存在特定的value。
问题
此代码将始终在resultSet.getString(columnName) 处抛出SQLException: "ResultSet closed"。该值是否已存在于表中并不重要。我的查询也可能是错误的,因为我没有得到应该放在select 之后的内容。我曾经在那里有一个1,但每个人都使用* 表示“所有”,但它没有任何改变。我真的没有得到this,因为它对我来说太复杂了,我只是想知道select 之后的论点是做什么的..
方法
我尝试了很多事情并阅读了很多线程,但我遇到的唯一一件事是我需要先调用 resultSet.next() 并且 ResultSet 不会以这种方式抛出 ResultSet closed 异常,但它没有改变任何东西。
如果有更好的方法来检查表中是否已存在值,请告诉我。
可视化
我在这里有一张表(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)
【问题讨论】:
-
您已将列名用单引号括起来,将其转换为字符串文字。
-
在此之前我得到“column columnName 不存在”异常,即使它确实存在
-
我总是将 ResultSet.next() 调用包装到 if 中。如果实际上有一个新行被读取,它返回 true。然后才从结果集中读取值
-
您也可以通过为 getter 提供列号(从 1 开始)来读取值,例如
resultSet.getString(1)-> 因为您只选择 1 列,它始终是正确的列跨度> -
只是为了澄清我的最后一条评论:SQLite(除了 MySQL 和类似的)没有服务器,一旦收到插入请求就会写入文件。连接到它的每个程序都必须手动存储更改(java JDBC 会为您执行此操作,除非您关闭了自动提交)。因此,如果您在“客户端”中插入该行,我猜是第 3 方数据库编辑器并且您没有在此处按保存,则数据库文件还没有收到这些更改(因为它们仅在 db 编辑器中是本地的)
标签: java sqlite jdbc resultset