OpenCsv | SQL | 只写入标题而不是表格内容

我试图通过Java执行一个SQL语句,并将结果写入一个.csv文件。

我正在使用OJDBC.jar (v7)连接Oracle 11g DB和OPENCSV.jar (v3.8)来创build和写入excel。

表结果打印得很好。 我正在使用pipe道来分隔logging中的所有列值。

但是,在生成的csv文件中,我只能看到表的列名,根本没有数据! 可能是什么原因? 请帮忙。

package test; import java.io.FileWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; import com.opencsv.CSVWriter; public class AllInOne { static String hostIP="255.255.255.255"; static String PortNum="1521"; static String ServiceName="SNAME"; static String un="USER"; static String pw="PWD"; static int columnCount; static String row=""; public static void main(String[] args) throws Exception { String addr = "jdbc:oracle:thin:@"+hostIP+":"+PortNum+":"+ServiceName; Class.forName("oracle.jdbc.OracleDriver"); Connection con = DriverManager.getConnection(addr,un,pw); Statement stat = con.createStatement(); ResultSet rs = stat.executeQuery("select * from t_employee_info where rownum <6"); ResultSetMetaData resultSetMetaData = rs.getMetaData(); columnCount = resultSetMetaData.getColumnCount(); while (rs.next()) { for (int i = 1; i <= columnCount; i++) { row += rs.getString(i) + "|"; } System.out.println(row); row = ""; } FileWriter fw=new FileWriter("C:/Users/myName/Desktop/Folder/CSVfile.csv"); CSVWriter writer = new CSVWriter(fw); writer.writeAll(rs,true); writer.close(); fw.close(); stat.close(); con.close(); System.out.println("File Generated"); } } 

Shreyas,你已经迭代了一次结果集。 所以你的select是在你遍历RS到一个variables(比如|分隔值的列表)并将它们传递给CSV编写器上的一个方法时存储这些值。

第二个选项是实际使用rs.first()(假设你有一个可滚动的结果集),然后把它传递给方法。 然而,这不是一个很好的做法

Shreyas,Ramachandran有正确的答案。 将ResultSet视为查询结果的迭代器。 通过循环ResultSet来logging查询的输出,你传递一个空的结果集opencsv。 这就是为什么你只看到标题。

我的JDBC经验相对有限,所以我不能告诉你为什么rs.first()或rs.beforeFirst()不是一个好的做法,但如果这不起作用,你必须logging结果集并创build一个CSV文件,然后先执行第一个/ beforeFirst或者再次运行查询。 就我个人而言,我会考虑删除日志logging,并创build自己的自定义类,它inheritance了您在FileWriter中传递的Writer接口,并通过将其传递到CSVWriter来logging正在写入的文件。