java - 如何保持结果集打开,或调用不同的结果集?

标签 java sql sqlite jdbc

我正在使用 JDBC 和 SQLite 在同一个 .java 文件中的 2 个单独数据库上运行查询,但是当我尝试对单独的结果集进行第二次调用时,我收到一个错误,即结果集已关闭。我设置了连接和所有内容,然后进行了 3 次单独的调用,像这样....然后调用 ResultSet获取数据的对象。第一次调用 mealSet 时出现错误

        Class.forName("org.sqlite.JDBC");
        Connection conn1 = null;
        conn1 = DriverManager.getConnection("jdbc:sqlite:workoutLog.db");
        @SuppressWarnings("null")
        PreparedStatement workoutQuery= conn1.prepareStatement("SELECT * FROM workoutLog");// ORDER BY t desc limit 1");
        ResultSet workoutSet = workoutQuery.executeQuery();


        Class.forName("org.sqlite.JDBC");
        Connection conn2 = null;
        conn2 = DriverManager.getConnection("jdbc:sqlite:foodLog.db");
        PreparedStatement getFoodLog = conn2.prepareStatement("SELECT * FROM foodLog");// ORDER BY t desc limit 3");
        ResultSet mealSet = getFoodLog.executeQuery();
        mealSet.next();

        meals.add(breakfast);
        meals.add(lunch);
        meals.add(dinner);

        weekStart = workoutSet.getInt(ID_COLUMN);
        weekEnd = weekEnd + 6;
        Class.forName("org.sqlite.JDBC");
        Connection conn3 = null;
        conn3 = DriverManager.getConnection("jdbc:sqlite:projectLog.db");
        PreparedStatement getProjectLog = conn3.prepareStatement("SELECT * FROM projectLog");
        ResultSet projectSet = getProjectLog.executeQuery();
        ResultSetMetaData meta = projectSet.getMetaData();


        for (int i=3;i<meta.getColumnCount()-1;i++){
            String prj="";
            projects.add(prj);
        }


        while ( projectSet.next()){

            for (int i=3;i<=meta.getColumnCount()-1;i++){
                int arrayPos = 0;
                String temp =projectSet.getString(i) + "\n";
                projects.set(arrayPos, projects.get(arrayPos).concat(temp));
                projectNames.add(meta.getColumnName(i));
                totalHours+=projectSet.getInt(3);
                totalMinutes+=projectSet.getInt(meta.getColumnCount());
                arrayPos++;
            }


            for (int k=0;k<=2;k++){
            breakfast=mealSet.getString(BREAKFAST_COLUMN)+" \n";
            lunch=mealSet.getString(LUNCH_COLUMN)+" \n"; 
            dinner=mealSet.getString(DINNER_COLUMN)+" \n";
            meals.set(0, meals.get(0).concat(breakfast));
            meals.set(1, meals.get(1).concat(lunch));
            meals.set(2, meals.get(2).concat(dinner));
            mealSet.next(); 
        }

错误是...
Exception in thread "main" java.sql.SQLException: ResultSet closed
    at org.sqlite.RS.checkOpen(RS.java:63)
    at org.sqlite.RS.markCol(RS.java:77)
    at org.sqlite.RS.getString(RS.java:313)
    at WeeklyReport.main(WeeklyReport.java:99)

最佳答案

您不能重复使用相同的 ResultSet例如许多查询。一个ResultSet instance 只能用于获取一个查询的结果。

此外,正如 ResultSet 中所写Java文档:

ResultSet object is automatically closed when the Statement object that generated it is closed, re-executed, or used to retrieve the next result from a sequence of multiple results.

关于java - 如何保持结果集打开,或调用不同的结果集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16511863/

相关文章:

ios - Swift Sqlite 模型绑定(bind)

mysql : select a "rollback" query (visualizing the rollback query)

RSQLite 并将数据读入内存

java - 卡夫卡 : Cannot create embedded kafka server

java - Google App Engine Flex 在运行 Play Framework 应用程序时出现 No X11 DISPLAY variable was set 错误;我在哪里设置这个变量?

sql - 当前月份的当前周数

mysql - MySQL针对大表的优化

node.js - 可以将选项添加到 npm package.json 依赖项吗?

java - RxJava 适合分支工作流程吗?

java - 实例化类返回空值