4

ResultSet videoFilenames には 4162 行が必要です (データベースでクエリをテストしました) が、while ループ 'while (videoFilenames.next())' は 1 回だけ繰り返されます - 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();

    }

}
4

2 に答える 2

4

Statement オブジェクトごとに 1 つの ResultSet オブジェクトのみを同時に開くことができます

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

したがって、同じ Statement インスタンスを使用して while ループ内で 2 番目のクエリを実行すると、videoFilenames ResultSet が閉じられます。

于 2012-09-04T19:28:35.287 に答える
2

Javaステートメントのドキュメントには次のように書かれています。

デフォルトでは、Statement オブジェクトごとに 1 つの ResultSet オブジェクトのみを同時に開くことができます。したがって、ある ResultSet オブジェクトの読み取りが別の ResultSet オブジェクトの読み取りとインターリーブされている場合、それぞれが異なる Statement オブジェクトによって生成されている必要があります。Statement インターフェースのすべての実行メソッドは、開いているステートメントの現在の ResultSet オブジェクトが存在する場合、そのオブジェクトを暗黙的に閉じます。

stmtつまり、ある ResultSet をループして、同じオブジェクトを使用して別の ResultSet を作成することはできません。これにより、最初の ResultSet が閉じられ、ループが終了します。

于 2012-09-04T19:28:02.277 に答える