【问题标题】:OpenCsv | SQL | Writes only the header and not the table contentOpenCsv | SQL |仅写入标题而不写入表格内容
【发布时间】:2016-08-27 11:41:18
【问题描述】:

我正在尝试通过 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.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 sql excel jdbc opencsv


    【解决方案1】:

    Shreyas ,您已经对结果集进行了一次迭代。因此,您可以选择在将 RS 迭代到变量时存储值(例如 | 分隔值的列表)并将它们传递给 CSV Writer 上的方法。

    第二个选项是实际使用 rs.first() (假设您有一个可滚动的结果集),然后将其传递给该方法。然而,这不是一个好习惯

    【讨论】:

      【解决方案2】:

      Shreyas,Ramachandran 有正确的答案。将 ResultSet 视为查询结果的迭代器。通过遍历 ResultSet 以记录查询的输出,您将向 opencsv 传递一个空结果集。这就是为什么您只看到标题的原因。

      我在 JDBC 方面的经验相对有限,所以我无法告诉您为什么 rs.first() 或 rs.beforeFirst() 不是一个好的做法,但如果这不起作用,您必须同时记录结果集并创建一个csv 文件,然后执行 first/beforeFirst 或第二次运行查询。就个人而言,我会考虑删除日志记录并创建您自己的自定义类,该类继承您在 FileWriter 中传递的 Writer 接口,并通过将其传递给 CSVWriter 来使用它来记录您正在写入文件的内容。

      【讨论】:

        猜你喜欢
        • 2013-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多