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

Posted

技术标签:

【中文标题】如何保持结果集打开,或调用不同的结果集?【英文标题】:How can I keep the resultSet open, or make calls to different resultSets? 【发布时间】:2013-05-12 20:44:05 【问题描述】:

我正在使用 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)

【问题讨论】:

发布足够的代码让我们看到整个画面,并发布带有回溯的确切错误(如果可用)。 已编辑:添加了更多代码和错误跟踪 看看这个讨论:***.com/questions/10977064/jdbc-resultset-closed 【参考方案1】:

您不能将同一个ResultSet 实例重复用于多个查询。一个ResultSet 实例只能用于获取一个查询的结果。

另外写在ResultSetJavaDoc:

ResultSet 对象在生成它的 Statement 对象关闭、重新执行或用于从多个结果序列中检索下一个结果时自动关闭。

【讨论】:

但是即使我没有使用相同的 ResultSet 实例,我也会收到此错误...我故意为每组调用创建多个实例。 你的陈述会发生什么?也许您可以粘贴应用程序的整个代码?

以上是关于如何保持结果集打开,或调用不同的结果集?的主要内容,如果未能解决你的问题,请参考以下文章

数据访问设计:多个结果集单个存储过程或每个存储过程单个结果集

每个连接只能打开和使用一个流式传输结果集。确保您已对任何活动结果调用 .close()

如何使从 oracle 返回的结果集保持其列别名字符大小写

sqlserver 存储过程 返回结果集的 例子

Java JDBC 从不同的调用返回重复的结果集

如何在java中合并来自两个不同数据库的两个不同结果集