2015-08-18 50 views
0

我有一個jTable,有4列和6行。我想迭代通過行索引列索引0這是我的ID列的值,並將其傳遞給計數SQL查詢。我寫了下面的代碼,因爲我沒有想出如何在遍歷表後傳遞列值。是通過jTable遍歷並將列值傳遞給java中的sql查詢

有人請讓我知道我的代碼做錯了請。

for (int row = 0; row > jTable2.getRowCount(); row++){ 
     for (int col =0; col > jTable2.getColumnCount(); col ++) 
     try{ 
      DefaultTableModel model = (DefaultTableModel)jTable2.getModel(); 
      String selected = model.getValueAt(row, col+1).toString(); 
      String sql = "select COUNT(COURSEBOOKED) from APP.BOOKCOURSE where COURSEBOOKED = '"+selected+"'"; 
      try(Connection con = DriverManager.getConnection("jdbc:derby:MTD","herbert","elsie1*#"); 
       PreparedStatement pst = con.prepareStatement(sql);) { 
        ResultSet rs = pst.executeQuery(); 
        while(rs.next()){ 
         String Sum = rs.getString("COUNT(COURSEBOOKED)"); 
         System.out.println(Sum); 
         if (rs.wasNull()){ 
          System.out.println("No record found"); 
         } 
        } 
      } 
      catch(SQLException e){ 
      } 
     } 
     catch(Exception e){ 
     } 
    } 

這是修改後提出的最終代碼。

 String sql = "select COUNT(COURSEBOOKED) as count from APP.BOOKCOURSE where COURSEBOOKED =?"; 
    try(Connection con = DriverManager.getConnection("jdbc:derby:MTD","herbert","elsie1*#"); 
      PreparedStatement pst = con.prepareStatement(sql);){ 
       for(int row = 0; row < jTable2.getRowCount(); row++){ 
         DefaultTableModel model = (DefaultTableModel)jTable2.getModel(); 
         String selected = model.getValueAt(row, 1).toString(); 
         pst.setString(1, selected); 
         try(ResultSet rs = pst.executeQuery();){ 
          while (rs.next()){ 
           String Sum = rs.getString("count"); 
           System.out.println(Sum); 
          } 
         } 
        } 
       } 
    catch(SQLException e){ 
     JOptionPane.showMessageDialog(this, e); 
    } 

這引出我的下一個問題。 AM不知道我是否應該爲它啓動一個新線程,或者繼續這個線程。我的挑戰是我現在想要在當前jTable2的現有4列上附加一列,並顯示上述查詢的值。添加一個新的專欄中,我已經使用這個代碼,

TableColumn c = new TableColumn(); 
c.setHeaderValue("Training accomplished"); 
model.addColumn(c); 

這增加了列,但它的填充與列索引0值。我如何從上面的查詢中得到Sum中保存的值所填充的新列。

+1

這不工作主要是因爲你的for循環是錯誤的。 'row'永遠不會是'> jTable2.getRowCount()'。 「col」相同。並且列從0開始,而不是1。您還應該學會正確使用準備好的語句。他們的重點是傳遞參數並避免字符串連接來傳遞它們。最後,停止捕捉異常並忽略它們。你這樣做是爲了打擊自己:如果拋出異常,你就不會知道它。 –

+0

'select COUNT(COURSEBOOKED)as summedValue ...'然後你就可以使用'rs.getString(「summedValue」)'代替。我想你會發現數據庫爲列指定了它自己的「名稱」,它與你的不匹配(作爲猜測) – MadProgrammer

+0

1.爲什麼當你只使用2nd for循環(在單元格上迭代)時需要索引爲0的單元?同樣,如JB已經告訴你的,兩個循環的終止條件都是錯誤的。你應該使用''''''''''''''。 2.由於JB已經說過,使用準備好的陳述。去谷歌上查詢。 3.爲什麼每次需要啓動查詢時都會創建新連接?非常無效。 4.按照MadProgrammer的說法在您的查詢中使用別名。它會幫助你獲得結果。 – Aakash

回答

0

你應該使用下面的東西。請注意,到目前爲止我還沒有測試過這個代碼,所以你可能需要調試它。同時檢查你的問題的意見。

String sql = "select COUNT(COURSEBOOKED) as count from APP.BOOKCOURSE where COURSEBOOKED = ?"; 
try(
    Connection con = DriverManager.getConnection("jdbc:derby:MTD","herbert","elsie1*#"); 
    PreparedStatement pst = con.prepareStatement(sql);){ 
    for (int row = 0; row < jTable2.getRowCount(); row++){ 
     DefaultTableModel model = (DefaultTableModel)jTable2.getModel(); 
     String selected = model.getValueAt(row, 0).toString(); 
     pst.setString(1, selected);    
     ResultSet rs = pst.executeQuery(); 
     while(rs.next()){ 
      String Sum = rs.getString("count"); 
      System.out.println(Sum); 
      if (rs.wasNull()){ 
       System.out.println("No record found"); 
      } 
     } 
    } 
} 
catch(SQLException e){ 
} 
catch(Exception e){ 
} 
+0

至少,您在答案中發佈的代碼應該編譯...有一個downvote。 – hd1

+0

高興@ hd1:P – Aakash

+0

現在等一下。我們現在嘗試使用資源作爲功能。你知道嗎?我們已經有相當一段時間了。另外,你已經編輯了代碼。如果你有任何問題,也許你可以格式化代碼。 – Aakash