使用SQLite JDBC 3.21.0执行简单查询无数据返回求助
问题根源:提前关闭数据库资源导致ResultSet无法读取
嘿,我一眼就发现你代码里的致命问题了——你在遍历ResultSet之前就关闭了Statement和Connection!
为什么会无数据返回?
ResultSet默认不会把查询结果一次性加载到内存,它完全依赖底层的Statement和数据库Connection来逐行读取数据。你在执行executeQuery后立刻调用S.close()和conn.close(),等于直接切断了ResultSet的数据源,后续遍历自然读不到任何内容。
修正后的代码
把资源关闭的操作放到遍历完ResultSet之后,同时推荐使用try-with-resources语法(Java 7+支持),它能自动帮你关闭实现了AutoCloseable接口的资源(比如Connection、Statement、ResultSet),避免手动关闭的遗漏或顺序错误:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.logging.Level; import java.util.logging.Logger; public class TestJDBC1 { public static Connection connect_DB() throws ClassNotFoundException { Class.forName("org.sqlite.JDBC"); Connection conn = null; try { String url = "jdbc:sqlite:/Users/Shared/DB_Farmaci/oracle-sample.db"; conn = DriverManager.getConnection(url); System.out.println("Connection a SQLite stabilita."); } catch (SQLException e) { System.out.println(e.getMessage()); } return conn; } public static void main(String[] args) throws ClassNotFoundException, InterruptedException, SQLException { // 使用try-with-resources自动管理Connection try (Connection conn = connect_DB()) { conn.setAutoCommit(false); // try-with-resources管理Statement和ResultSet try (Statement S = conn.createStatement(); ResultSet rs = S.executeQuery("select deptno, dname, loc from dept")) { int x = 0; while (rs.next()) { x++; // 注意:loc是字符串类型,应该用getString而不是getDouble System.out.println(rs.getInt("deptno") + "\t" + rs.getString("dname") + "\t" + rs.getString("loc")); } if (x > 0) { System.out.println("# rows returned => " + x); } else { System.out.println("no rows returned"); } } catch (SQLException se) { System.out.println(se); System.out.println("errore DB"); } } } }
额外注意点
- 字段类型匹配:你原来的代码里用
rs.getDouble("loc"),但DEPT表中的loc是字符串类型(比如"NEW YORK"),用getDouble会抛出类型转换异常,改成getString("loc")才正确。 - 资源关闭顺序:即使不用try-with-resources,手动关闭的顺序也应该是:先关ResultSet,再关Statement,最后关Connection,避免依赖资源提前被释放。
- 自动提交设置:对于SELECT查询来说,
setAutoCommit(false)其实没必要,但这个不影响查询结果,只是提一下。
验证建议
你可以先运行修正后的代码,应该就能正常读取到数据了。如果还是有问题,可以再核对:
- 数据库文件路径是否完全正确(虽然你说其他工具能访问,但细节里容易出错)
- 查询语句中的表名、字段名是否和数据库中的完全一致(SQLite默认大小写不敏感,但保持一致更稳妥)
内容的提问来源于stack exchange,提问作者Sandro19200
相关产品推荐
相关产品推荐

