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();
}
}
答案 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并结束循环。