2012-10-09 36 views
2

嗨,大家好,我試圖打印從銷售表(Oracle)的所有交易到一個文本文件中。不幸的是,它只寫了一條記錄,而表中有許多符合條件的記錄。有人可以告訴我這是什麼問題嗎?寫一個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); 
     } 
     } 
+0

除了Vikdor的回答,爲什麼要將收據字符串拆分爲「\ n」(換行符)?然後部分與新行之間?此外,很少有需要在每行之間執行bw.flush()。請記住,當你完成後關閉作家。 –

回答

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中建立一個字符串,然後寫入字符串到文件

UPDATE

考慮更改與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(); 
+0

您不斷地將行連接到收據字符串,所以如果有許多記錄,字符串將變得很大。另外,對於您閱讀的每條記錄,您輸出迄今爲止讀取的所有記錄。如果你想把所有記錄連接到一個字符串,你應該移動你的寫邏輯。 –

+0

@RogerLindsjö絕對正確!更新它! – MaVRoSCy

+0

爲什麼不直接將每張收據寫入作者?這是浪費內存:bw.write(rs.getString ...) – Matt

3

您正在打開的文件中ResultSet每個記錄,在while循環,因此該文件被覆蓋掉了,只有最後一條記錄仍當您完成處理來自ResultSet的所有行。

此舉BufferedWriter while循環之外,並關閉其與結果集,語句和連接一起。

相關問題