2015-11-05 149 views
1
  1. 我正面臨一個小問題。我從表中獲取數據,然後循環結果集。在每個循環中,我使用結果集返回的行數據 在另一個表上執行另一個查詢。我發佈了 下面的代碼。結果集內的結果集

  2. 問題是,我感覺到我的代碼中有一些問題,但不能 識別它。代碼運行良好,沒有任何錯誤或異常。幫我找到問題。並且解釋我也是。

  3. 我知道我們可以使用Dao作爲第一個結果集。但不會 創建太多的對象。

    public ResultSet search_NatSupport() throws ClassNotFoundException,  SQLException { 
    
    String query = "SELECT SYMBOL, Date, sup, res FROM Nat_Support WHERE SYMBOL IS NOT ?;"; 
    
         PreparedStatement stmt = null; 
         ResultSet rs   = null; 
         DBHelper helper   = DBHelper.getInstance(); 
    
         stmt = helper.getConn().prepareStatement(query); 
         stmt.setString(1, null); 
         rs = stmt.executeQuery(); 
    
         return rs; 
        } 
    
        public void searchAgain(ResultSet rs) { 
    
        String query = "select * from bhav_NSE where symbol = ?"; 
    
        PreparedStatement stmt = null; 
    
        try { 
    
         while (rs.next()) { 
    
          stmt = DBHelper.getInstance().getConn().prepareStatement(query); 
          stmt.setString(1, rs.getString(1)); 
          ResultSet res = stmt.executeQuery(); 
    
          while(res.next()){ 
           System.out.println(res.getString(1)); 
          } 
          res.close(); 
         } 
         rs.close(); 
        } catch (SQLException | ClassNotFoundException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
    
    } 
    
    
    
        public static void main(String[] args) { 
    
        BhavMaster_NSE finals = new BhavMaster_NSE(); 
    
        try { 
    
         finals.searchAgain(finals.search_NatSupport()); 
    
        } catch (ClassNotFoundException | SQLException e) { 
    
         // TODO Auto-generated catch block 
    
         e.printStackTrace(); 
    
        } 
    
    } 
    
+3

所以結合不爲空,究竟是怎麼回事錯在這裏? – Mureinik

+0

沒有錯,但我懷疑我的方法使用結果集。在另一個循環結果集中使用一個結果集可以嗎? – Anant666

+0

不,它可能只使用一個請求(類似於'SELECT * FROM bhav_NSE where符號IN(SELECT DISTINCT SYMBOL FROM Nat_Support)'。btw,你正在泄漏資源 – 2015-11-05 06:30:07

回答

0

相反的兩個結果集,加入表上的按鍵,(這裏符號),並在同一查詢

public void search() 
     { 
      PreparedStatement stmt = null; 
      String query = "select bnse.* from bhav_NSE bnse,Nat_Support nsup where bnse.symbol=nsup.symbol and nsup.symbol is not null"; 
      stmt = DBHelper.getInstance().getConn().prepareStatement(query); 
      ResultSet res = stmt.executeQuery(); 

       while(res.next()){ 
        // Get data res.getString(..); 
       } 
       res.close(); 
      } 
      rs.close(); 

     } 
+0

這是一個不錯的和簡短的解決方案,試試吧。 – Anant666

+0

使用內部連接,像魅力一樣工作。謝謝 – Anant666

0

我得到了這個問題,一旦我需要使用resultset的返回結果作爲另一個輸入,但我發現,我不能做到這一點,調試後,我發現,當你寫一個Resultset第一個成爲內Resultset等於Null

因此,這裏是一招:

public void searchAgain(ResultSet rs) { 
    try { 
     while (rs.next()) { 
      bhavNse(rs.getString(1)); 
     } 
     rs.close(); 
    } catch (SQLException | ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 
public void bhavNse(String var) { 
    try { 
     String query = "select * from bhav_NSE where symbol = ?"; 
     PreparedStatement stmt = null; 
     stmt = DBHelper.getInstance().getConn().prepareStatement(query); 
     stmt.setString(1, var); 
     ResultSet res = stmt.executeQuery(); 
     while(res.next()){ 
      System.out.println(res.getString(1)); 
     } 
     res.close(); 
     } 
     catch (SQLException | ClassNotFoundException e) { 
     e.printStackTrace(); 
     } 
} 
0
  1. 您不需要在查詢結束時放置;。使用任何Closeable資源

即使你想扔Exception的被調用時,與資源

  • 使用嘗試,你可以用throw關鍵字做到這一點。

    try(Connection conn = DBHelper.getInstance().getConn()) { 
        PreparedStatement stmt = conn.prepareStatement(query); 
        ... 
        ResultSet res = stmt.executeQuery(); 
        ... 
    } catch (SQLException ex) { 
        // handle exception here or throw it as below : 
        throw ex; 
    } 
    

    try-with-resource即使發生任何故障,也會關閉所有資源。

    舊的方法是介意關閉資源失敗併成功了。

  • +0

    try-with-resource是一個不錯的選擇,但我們使用Jdk 1.6,因此我們必須經歷很長的路。爲了兼容性,我必須稍後更改代碼,因爲我在這裏使用了多個catch。這將在Java 6中給出錯誤。 – Anant666