Java OpenCsv | SQL |只写入标题而不写入表内容
我试图通过Java执行SQL语句,并将结果写入.csv文件 我正在使用OJDBC.jar(v7)连接到Oracle 11g DB和OPENCSV.jar(v3.8)创建并写入excel 表格结果打印得很好。我使用管道来分隔记录中的所有列值 但是,在生成的csv文件上,我只看到表的列名,根本看不到数据!原因可能是什么?请帮忙Java OpenCsv | SQL |只写入标题而不写入表内容,java,sql,excel,jdbc,opencsv,Java,Sql,Excel,Jdbc,Opencsv,我试图通过Java执行SQL语句,并将结果写入.csv文件 我正在使用OJDBC.jar(v7)连接到Oracle 11g DB和OPENCSV.jar(v3.8)创建并写入excel 表格结果打印得很好。我使用管道来分隔记录中的所有列值 但是,在生成的csv文件上,我只看到表的列名,根本看不到数据!原因可能是什么?请帮忙 package test; import java.io.FileWriter; import java.sql.Connection; import java.sql.D
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");
}
}
封装测试;
导入java.io.FileWriter;
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.PreparedStatement;
导入java.sql.ResultSet;
导入java.sql.ResultSetMetaData;
导入java.sql.Statement;
导入com.opencsv.CSVWriter;
公共级蒜酮
{
静态字符串hostIP=“255.255.255.255”;
静态字符串PortNum=“1521”;
静态字符串ServiceName=“SNAME”;
静态字符串un=“USER”;
静态字符串pw=“PWD”;
静态int列计数;
静态字符串行=”;
公共静态void main(字符串[]args)引发异常
{
String addr=“jdbc:oracle:thin:@”+hostIP+:“+PortNum+”:“+ServiceName;
类forName(“oracle.jdbc.OracleDriver”);
Connection con=DriverManager.getConnection(addr、un、pw);
Statement stat=con.createStatement();
ResultSet rs=stat.executeQuery(“从t_employee_info中选择*其中rownumShreyas,您已经对结果集进行了一次迭代。因此,您可以选择在将rs迭代到变量时存储值(例如,一列|分隔值),并将其传递给CSV Writer上的方法
第二个选项是实际使用rs.first()(前提是您有一个可滚动的结果集),然后将其传递给该方法。然而,这不是一个很好的做法,因为您已经对结果集进行了一次迭代。因此,您可以选择在将rs迭代到变量时存储值(说出一列|分隔值)并将它们传递给CSV Writer上的方法
第二个选项是实际使用rs.first()(前提是您有一个可滚动的结果集)然后将其传递给该方法。然而,这不是一个很好的实践Shreyas,Ramachandran有正确的答案。请将ResultSet视为查询结果的迭代器。通过循环ResultSet来记录查询的输出,您将向opencsv传递一个空的结果集。这就是您只看到标题的原因。
我对JDBC的经验相对有限,所以我无法告诉您为什么是rs.first()或rs.beforeFirst()这不是一个好的实践,但是如果这不起作用,你必须同时记录结果集并创建一个CSV文件,那么要么先做/先做,要么运行第二次查询。个人而言,我会考虑删除日志记录,并创建自己的自定义类,继承自定义在文件写入器中传递的写入器接口,并将其使用到LO。g通过将结果集传递到CSVWriter,您正在写入文件。Shreyas,Ramachandran得到了正确的答案。将结果集视为查询结果的迭代器。通过循环结果集来记录查询的输出,您正在向opencsv传递一个空结果集。这就是您只看到标题的原因
我对JDBC的经验相对有限,所以我无法告诉您为什么是rs.first()或rs.beforeFirst()这不是一个好的实践,但是如果这不起作用,你必须同时记录结果集并创建一个CSV文件,那么要么先做/先做,要么运行第二次查询。个人而言,我会考虑删除日志记录,并创建自己的自定义类,继承自定义在文件写入器中传递的写入器接口,并将其使用到LO。g通过将其传递到CSVWriter,您正在写入文件的内容