2

大家好,我正在尝试将销售表(Oracle)中的所有交易打印到文本文件中。不幸的是,它只写入一条记录,而表中有许多符合条件的记录。有人可以告诉我问题是什么吗?

这是我的代码:

 public void actionPerformed(ActionEvent ae) {
    Object obj = ae.getSource();

    if (obj == btnSave) {
        Connection conn = null;
        String receno = Lrecno.getText();
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "MUNGAI", "gatungo87");
            Statement st = conn.createStatement();
            String recp = "select PART_DESC, QUNTY, UNIT_SALE, TOTAL_SALE from sales where session_id = '" + receno + "'";
            ResultSet rs = st.executeQuery(recp);
            while (rs.next()) {
                File f = new File("Sale Receipts");
                f.mkdir();
                BufferedWriter bw = new BufferedWriter(new FileWriter("Sale Receipts/Sale" + Lrecno.getText() + ".TXT"));
                String receipt = rs.getString("PART_DESC") + "  " + rs.getString("QUNTY") + "  "
                        + rs.getString("UNIT_SALE") + "  " + rs.getString("TOTAL_SALE");
                String[] rece = receipt.split("\n");
                for (int i = 0; i < rece.length; i++) {
                    bw.write(receipt);
                    bw.flush();
                    bw.newLine();

                }
                JOptionPane.showMessageDialog(this, "Item sold successfully",
                        "Success", JOptionPane.PLAIN_MESSAGE);
            }
        } catch (Exception ad) {
            JOptionPane.showMessageDialog(this, ad,
                    "Error", JOptionPane.PLAIN_MESSAGE);
        }
       }
4

2 回答 2

3

您正在为循环中的ResultSet, 中的每条记录打开文件while,因此文件被覆盖,当您处理完ResultSet.

将其BufferedWriter移出 while 循环并将其与结果集、语句和连接一起关闭。

于 2012-10-09T05:45:21.693 回答
2

你可以试试这个:

  File f = new File("Sale Receipts");
  f.mkdir();
  BufferedWriter bw = new BufferedWriter(new FileWriter("Sale Receipts/Sale" + Lrecno.getText() + ".TXT"));
  String receipt="";
  while (rs.next()) {
        receipt += rs.getString("PART_DESC") + "  " + rs.getString("QUNTY") + "  "
                   + rs.getString("UNIT_SALE") + "  " + rs.getString("TOTAL_SALE");
        String[] rece = receipt.split("\n");
        for (int i = 0; i < rece.length; i++) {
            bw.write(receipt);
            bw.flush();
            bw.newLine();
        }
        JOptionPane.showMessageDialog(this, "Item sold successfully",
                "Success", JOptionPane.PLAIN_MESSAGE);
    }

您的错误是,对于您创建的表中的每一行并将其写入文件,然后您继续覆盖同一个文件。

正确的方法是通过迭代ResultSet来构建String,然后将String写入文件

更新

考虑使用 StringBuilder 对象更改字符串以解决性能问题。

  StringBuilder  receipt = new StringBuilder();
  while (rs.next()) {
        receipt.append( rs.getString("PART_DESC") + "  " + rs.getString("QUNTY") + "  "
                   + rs.getString("UNIT_SALE") + "  " + rs.getString("TOTAL_SALE"));
        receipt.append("\n");
        JOptionPane.showMessageDialog(this, "Item sold successfully",
                "Success", JOptionPane.PLAIN_MESSAGE);
  }
  bw.write(receipt.toString());
  bw.flush();
  bw.newLine();
于 2012-10-09T05:49:56.937 回答