2

こんにちは、販売テーブル (Oracle) からすべてのトランザクションをテキスト ファイルに出力しようとしています。残念ながら、基準を満たすレコードがテーブルに多数あるにもかかわらず、1 つのレコードしか書き込んでいません。誰かが私に何が問題なのか教えてもらえますか?

ここに私のコードがあります:

 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.

これを while ループの外側に移動BufferedWriterし、結果セット、ステートメント、および接続と共に閉じます。

于 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 オブジェクトを使用して String を変更することを検討してください。

  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 に答える