2012-12-14 30 views
1

我遇到的問題是我要創建一個servlet,它將從三個表(SQL)中獲取數據並將它們打印到html表中。Java Servlet SQL表

的表的結構如下:

blog_comments:

row id (auto increments), 
blogger id, 
entry_tstamp, 
t_stamp, 
comment, 
author_id, 

blog_entries:

row id(auto increments), 
blogger_id, 
timestamp, 
entry, 

blogger_info:

row id(auto increments), 
blogger_id, 
name, 
email address, 
image, 
password, 

該博客條目是orignal帖子和blog_comments與該帖子相關。我試圖創建一個表格,在第一行以及第二行和下面的文章中顯示博主的詳細信息,然後顯示該博客的相關評論(來自blog_entries)。

我想使用一段時間的聲明(如下所示)。我不得不使用while語句初步獲取原始博客帖子和博客ID,第二次顯示與此相關的評論。

我有一些困難,因爲它去throught第二while循環,它將取消第一while循環(後一個增量),然後轉儲離開第二while循環的內容。

有誰知道是否有更好的方法來實現這個?我應該使用比較循環嗎?我相信我的編碼是錯誤的。誰能告訴我我要去哪裏?

謝謝。

CODE:

 try { 
      Class.forName("org.sqlite.JDBC"); 
      con = DriverManager.getConnection("jdbc:sqlite:E:/My Documents/NetBeansProjects/co2509blog.sqlite"); 
      stmt = con.createStatement(); 
      //String temp = "SELECT entry, name, email, image, comment from blog_comments C, blog_entries E, blogger_info I where E.blogger_id = I.blogger_id AND I.blogger_id = C.author_id ORDER BY E.timestamp"; 
      //String temp = "SELECT entry, name, email, image from blog_entries E, blogger_info I where E.blogger_id = I.blogger_id ORDER BY E.timestamp"; 
      //String temp = "SELECT entry, name, email, image, comment from blogger_info I JOIN blog_entries E ON I.blogger_id = E.blogger_id JOIN blog_comments C ON I.blogger_id = C.author_id WHERE E.timestamp = C.entry_tstamp ORDER BY E.timestamp"; 
      String query = "SELECT name, image, email, entry FROM blogger_info I, blog_entries E WHERE I.blogger_id = E.blogger_id ORDER BY E.timestamp"; 
      String query2 = "SELECT name, image, email, comment FROM blogger_info I, blog_entries E, blog_comments C WHERE I.blogger_id = C.author_id AND E.timestamp = C.entry_tstamp ORDER BY E.timestamp"; 
      rs = stmt.executeQuery(query); 


      //rs2 = stmt.executeQuery(secondQuery); 
      // displaying records 
      int rowCount = 0; 
      int rowCount2 = 0; 

      out.println("<P ALIGN='center'><TABLE BORDER=5>"); 
      ResultSetMetaData rsmetadata = rs.getMetaData(); 
      int columnCount = rsmetadata.getColumnCount(); 
      // table header 
      out.println("<TR>"); 
      for (int i = 0; i < columnCount; i++) { 
       out.println("<TH>" + rsmetadata.getColumnLabel(i + 1) + "</TH>"); 
      } 
      out.println("</TR>"); 
      { 
       while (rs.next()) { 
        rowCount++; 
        out.println("<TR>"); 
        for (int i = 0; i < columnCount; i++) { 
         out.println("<TD>" + rs.getString(i + 1) + "</TD>"); 
        } 
        rowCount2++; 
        rs2 = stmt.executeQuery(query2); 
        ResultSetMetaData rsmetadata2 = rs2.getMetaData(); 
        int columnCount2 = rsmetadata2.getColumnCount(); 

        rsmetadata2 = rs2.getMetaData(); 
        out.println("</TR>"); 
        while (rs2.next()) { 
         rowCount2++; 
         out.println("<TR>"); 
         for (int j = 0; j < columnCount2; j++) { 
          out.println("<TD>" + rs2.getString(j + 1) + "</TD>"); 
         } 

        } 

       } 
       out.println("</TR>"); 
      } 
      out.println("</TABLE></P>"); 

     } 

回答

1

下面的行重複使用所述第一查詢的語句:

rs2 = stmt.executeQuery(query2); 

作爲副作用,第一個結果集(rs)關閉。

要解決它,你需要創建一個單獨的語句內查詢:

stmt2 = con.createStatement(); 

.. 

rs2 = stmt2.executeQuery(query2); 

然而,這將是更有效的,如果你可以在兩個查詢合併成一個單一的一個。

+0

謝謝科多。 – MacKey