You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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");
            }
        }
    }
}

额外注意点

  1. 字段类型匹配:你原来的代码里用rs.getDouble("loc"),但DEPT表中的loc是字符串类型(比如"NEW YORK"),用getDouble会抛出类型转换异常,改成getString("loc")才正确。
  2. 资源关闭顺序:即使不用try-with-resources,手动关闭的顺序也应该是:先关ResultSet,再关Statement,最后关Connection,避免依赖资源提前被释放。
  3. 自动提交设置:对于SELECT查询来说,setAutoCommit(false)其实没必要,但这个不影响查询结果,只是提一下。

验证建议

你可以先运行修正后的代码,应该就能正常读取到数据了。如果还是有问题,可以再核对:

  • 数据库文件路径是否完全正确(虽然你说其他工具能访问,但细节里容易出错)
  • 查询语句中的表名、字段名是否和数据库中的完全一致(SQLite默认大小写不敏感,但保持一致更稳妥)

内容的提问来源于stack exchange,提问作者Sandro19200

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:00:44