打开CSV | SQL |仅写入 header 而不是 table 内容
OpenCsv | SQL | Writes only the header and not the table content
我正在尝试通过 Java 执行 SQL 语句并将结果写入 .csv 文件。
我正在使用 OJDBC.jar (v7) 连接到 Oracle 11g DB 和 OPENCSV.jar (v3 .8) 用于创建和写入 excel.
Table 结果打印的很好。我正在使用管道分隔记录中的所有列值。
但是,在生成的 csv 文件中,我只看到 table 的列名,根本看不到任何数据!可能是什么原因?请帮忙。
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,您已经对结果集进行了一次迭代。因此,您的选择是在将 RS 迭代到变量(比如 | 分隔值列表)时存储值,并将它们传递给 CSV Writer 上的方法。
第二个选项是实际使用 rs.first()(前提是您有一个可滚动的结果集),然后将其传递给该方法。然而,这不是一个很好的做法
Shreyas,Ramachandran 的答案是正确的。将 ResultSet 视为查询结果的迭代器。通过遍历 ResultSet 来记录查询的输出,您正在向 opencsv 传递一个空结果集。这就是您只看到 header 的原因。
我在 JDBC 方面的经验相对有限,所以我不能告诉你为什么 rs.first() 或 rs.beforeFirst() 不是一个好的做法,但如果那不起作用,你必须记录结果集并创建一个 csv 文件,然后再次执行 first/beforeFirst 或 运行 查询。就我个人而言,我会考虑删除日志记录并创建您自己的自定义 class,它继承了您在 FileWriter 中传递的 Writer 接口,并通过将其传递到 CSVWriter 中来使用它来记录您正在写入文件的内容。
我正在尝试通过 Java 执行 SQL 语句并将结果写入 .csv 文件。
我正在使用 OJDBC.jar (v7) 连接到 Oracle 11g DB 和 OPENCSV.jar (v3 .8) 用于创建和写入 excel.
Table 结果打印的很好。我正在使用管道分隔记录中的所有列值。
但是,在生成的 csv 文件中,我只看到 table 的列名,根本看不到任何数据!可能是什么原因?请帮忙。
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,您已经对结果集进行了一次迭代。因此,您的选择是在将 RS 迭代到变量(比如 | 分隔值列表)时存储值,并将它们传递给 CSV Writer 上的方法。
第二个选项是实际使用 rs.first()(前提是您有一个可滚动的结果集),然后将其传递给该方法。然而,这不是一个很好的做法
Shreyas,Ramachandran 的答案是正确的。将 ResultSet 视为查询结果的迭代器。通过遍历 ResultSet 来记录查询的输出,您正在向 opencsv 传递一个空结果集。这就是您只看到 header 的原因。
我在 JDBC 方面的经验相对有限,所以我不能告诉你为什么 rs.first() 或 rs.beforeFirst() 不是一个好的做法,但如果那不起作用,你必须记录结果集并创建一个 csv 文件,然后再次执行 first/beforeFirst 或 运行 查询。就我个人而言,我会考虑删除日志记录并创建您自己的自定义 class,它继承了您在 FileWriter 中传递的 Writer 接口,并通过将其传递到 CSVWriter 中来使用它来记录您正在写入文件的内容。