具有4162行的ResultSet仅迭代第一行

时间:2012-09-04 19:22:14

标签: java sql resultset

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();

    }

}

2 个答案:

答案 0 :(得分:4)

  

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

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

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

答案 1 :(得分:2)

Java Statement documentation说;

  

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

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