java结果集只写一行而不是全部选入.csv

时间:2014-04-18 20:27:59

标签: java mysql csv resultset jlist

我有一个java函数,用于从jlist中获取名为“readyList”的字符串,并从mysql工作台表中提取数据,意图为.csv文件中的每个字符串写一行。使用当前代码,它成功地一次拉出一个数据,就像我想要的那样,但它只写最后一行而不是所有行。我希望将所有行都写在.csv文件中。请帮忙!

int[] selectedIx = readyList.getSelectedIndices(); 
    for (int i = 0; i < selectedIx.length; i++) {
      //  while (i < selectedIx.length) {
           Object sel = readyList.getModel().getElementAt(selectedIx[i]);

    Statement s1 = DBConnect.connection.createStatement();
    String selTable01 = "SELECT Sku As s, Qty As q, Orig_Retail As prce, Orig_Sku As orgsk, Store As strcd "
                + "FROM completed_lines WHERE Form_Name = '" + sel + "' AND Warranty = 'true'";

        s1.execute(selTable01);
        try (ResultSet rs01 = s1.getResultSet()) {
            fWriter = new FileWriter("Exports/Transfers/" + /* frmNm.replace(":", "_") */"EBW_" + GtDates.fdate + ".csv", false);
            writer = new BufferedWriter(fWriter);
            String header = "slip_number,slip_type,out_store,in_store,item_number,quantity,price,comment,to_num";
            writer.write(header);  
            writer.newLine();
            while (rs01.next()) {
                String strcode = rs01.getString("strcd");
                String sku = rs01.getString("s");
                String qty = rs01.getString("q");
                String price = rs01.getString("prce");
                String orgsku = rs01.getString("orgsk");
                //System.out.println(frmNm.split("_")[1] + qty + "," + sku + "," + vendor + "," + desc1 + "," + reas + "," + descdmg + "," + orgR + "," + nwsku + "," + desc2 + "," + qtyI);
                String line = ""+","+"out"+","+strcode+","+"RTV"+","+sku+","+qty+","+price+","+"EBW"+","+orgsku;
                writer.write(line);
                writer.newLine();

            }
        } 
      //   JOptionPane.showMessageDialog(frame, "All Data from Selected Forms has been Exported");
    }
       //  FormCompelted();            

writer.close();

}

}

1 个答案:

答案 0 :(得分:0)

此代码存在一些问题。你只得到最后一个结果的原因是因为这一行:

fWriter = new FileWriter("Exports/Transfers/" + /* frmNm.replace(":", "_") */"EBW_" + GtDates.fdate + ".csv", false);

这一行在你的循环中。 false作为最后一个参数告诉FileWriter不要追加。换句话说,false表示覆盖文件(如果存在)。由于这是在您的循环中,每个结果都会覆盖最后一个结果创建的文件。您应该在循环之外创建FileWriter,可能是尝试使用资源。这样您就可以移除writer.close()来电,这应该是finally阻止。

与原始问题无关但您应该注意的事项:您每次循环迭代都会创建一个新的Statement。这可能是一项昂贵的操作。您应该使用PreparedStatement代替。在循环外创建它,然后只需设置参数并在循环内执行它。它还会实现AutoCloseable,因此您也可以尝试使用资源创建它,可能与您在FileWriter中创建的相同。