【问题标题】:java result set only writing one line instead of all selected into .csvjava结果集只写一行而不是全部选择到.csv
【发布时间】:2014-06-03 09:58:57
【问题描述】:

我有一个 java 函数,用于从名为“readyList”的 jlist 中获取字符串,并从 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();

}

}

【问题讨论】:

  • 在哪里以及如何声明writerfwriter

标签: java mysql csv resultset jlist


【解决方案1】:

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

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

这条线在你的循环里面。 false 作为最后一个参数告诉FileWriter 不要追加。换句话说,false 表示如果文件存在则覆盖该文件。由于这是在您的循环中,因此每个结果都会覆盖最后一个结果创建的文件。您应该在循环之外创建FileWriter,可能是在尝试使用资源。这将允许您删除您的 writer.close() 调用,它本来应该在 finally 块中。

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

【讨论】:

  • 在检查了几个建议并与我的老板交谈后,我发现这个功能正在做它应该做的事情,我希望它做得更多。 “sel”对象假设从 readyList 中提取一个特定的字符串,并从数据库中提取与 sel 匹配的所有数据,它做得很好。我希望这个函数从列表中的不同多个字符串中提取数据,并从不同字符串匹配的不同行中提取数据。
  • 我正在考虑使用嵌套在内部的函数创建另一个计数器循环,外部循环将提取不同的字符串并将其分配给“sel”,然后该函数完成其工作。我可以调整现有循环或通过轻微调整来复制它以使其工作吗?你怎么看?
猜你喜欢
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多