2015-11-05 183 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