【问题标题】:ResultSet with 4162 rows only iterates through first row具有 4162 行的 ResultSet 仅迭代第一行
【发布时间】:2012-09-04 19:22:13
【问题描述】:

ResultSet videoFilenames 应该有 4162 行(我在数据库中测试了查询)但是 while 循环“while (videoFilenames.next())”只迭代一次 - 在 ResultSet 中的第一个文件名之后,while 循环刚刚结束!谁能帮我弄清楚为什么?

/*
 * Run: java -cp .:ojdbc6.jar FindVideosWithoutTranscodes
 */

import java.io.*;
import java.sql.*;

public class FindVideosWithoutTranscodes {

    public static void main(String[] args) throws Exception {
        //connect to database
        Class.forName("oracle.jdbc.OracleDriver");
        String serverName = "***.***.***.***";
        String portNumber = "****";
        String sid = "*****";
        String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
        String username = "*****";
        String password = "*****";
        Connection conn = DriverManager.getConnection(url, username, password);
        Statement stmt = conn.createStatement();

        //create output file
        BufferedWriter out = new BufferedWriter(new FileWriter("mp2_files_without_transcodes.txt"));

        //get ResultSet of mp2 filenames
        ResultSet videoFilenames = stmt.executeQuery("select filename from archivefile where filename like '%.mp2'");

        System.out.println("Making list of mp2 files without transcodes...");

        //for each mp2 file
        String filename;
        ResultSet smallTranscode;
        ResultSet largeTranscode;
        while (videoFilenames.next()) {
            filename = videoFilenames.getString(1);

            //check for -700.mov file
            System.out.println(filename.substring(0, filename.length() - 4) + "-700.mov"); //test
            smallTranscode = stmt.executeQuery("select * from archivefile where filename='" + filename.substring(0, filename.length() - 4) + "-700.mov'");
            if (!smallTranscode.next())
                out.write(filename + "\n");
            else {
                //check for -6500.mov file
                System.out.println(filename.substring(0, filename.length() - 4) + "-6500.mov"); //test
                largeTranscode = stmt.executeQuery("select * from archivefile where filename='" + filename.substring(0, filename.length() - 4) + "-6500.mov'");
                if (!largeTranscode.next())
                    out.write(filename + "\n");
                largeTranscode.close();
            }
            smallTranscode.close();
        }

        System.out.println("Done.");

        out.close();
        videoFilenames.close();

    }

}

【问题讨论】:

    标签: java sql resultset


    【解决方案1】:

    每个 Statement 对象只能同时打开一个 ResultSet 对象 时间

    http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html

    因此,一旦您在 while 循环中使用相同的 Statement 实例执行第二个查询,您将关闭 videoFilenames ResultSet。

    【讨论】:

      【解决方案2】:

      Java Statement documentation 说;

      默认情况下,每个 Statement 对象只能打开一个 ResultSet 对象 同时。因此,如果读取一个 ResultSet 对象是 与另一个阅读交错,每个必须已经生成 通过不同的 Statement 对象。 Statement中的所有执行方法 接口隐式关闭语句的当前 ResultSet 对象,如果 打开一个存在。

      换句话说,您不能循环遍历一个 ResultSet 并使用相同的 stmt 对象创建另一个,这将关闭第一个 ResultSet 并结束循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-13
        • 2020-05-02
        • 1970-01-01
        • 2019-12-19
        • 2021-12-26
        • 1970-01-01
        • 1970-01-01
        • 2016-06-19
        相关资源
        最近更新 更多