2011-08-25 251 views
0

我有3級嵌套循環,應該執行一個查詢,一個更大的web服務的一部分,但問題是最外層的循環只執行一半的代碼如下:3級嵌套循環查詢不會運行外部循環

 PreparedStatement ps = conn.prepareStatement("INSERT INTO malattia (nome, eta, descrizione, sesso, etnia, sintomi) values (?, ?, ?, ?, ?, ?)"); 


       if(sexarra.length == 2){ 

        for(int k=0; k<sexarra.length; k++) { 
        for(int i=0; i<selec.length; i++){ 
         for(int j=0;j<sintom.length;j++){ 

         ps.setString(1, malattia); 
         ps.setInt(2, eta); 
         ps.setString(3, descrizione); 
         ps.setString(4, sexarra[k]); 
         ps.setString(5, selec[i]); 
         ps.setString(6, sintom[j]); 
         ps.executeUpdate(); 
         } 
        } 
        } 
      } 
       else { 

        for(int i=0; i<selec.length; i++){ 
         for(int j=0;j<sintom.length;j++){ 

         ps.setString(1, malattia); 
         ps.setInt(2, eta); 
         ps.setString(3, descrizione); 
         ps.setString(4, sexarra[0]); 
         ps.setString(5, selec[i]); 
         ps.setString(6, sintom[j]); 
         ps.executeUpdate(); 

         } 

        }     
       } 

       ps.close(); 
       //ds.close(); 
       conn.close(); 
       ris = "si"; 
       } catch (SQLException e) { 
        System.out.println("Errore: " + e.getMessage()); 

        return ris; 
       } 
     } 
     return ris; 
} 

的問題奠定了在sexarra.lengh=2,恰恰在最外環這應該重複兩次,但什麼程序儘快拋出異常K = 0與環路的第一部分都做了,我意味着它不執行與K=1相關的循環。我一直有嵌套循環和preparedstatement幾天的問題,這是最新的一個,我不知道我做錯了什麼。感謝您的時間和精力。

+0

你能正確地格式化你的代碼,所以我們可以更好地閱讀它嗎?另外,你是否說有拋出異常?在這種情況下,也請將例外作爲問題的一部分。 – momo

+1

而0接受8的答案不是很鼓舞人心。 –

+0

@momo我只知道拋出一個異常,因爲catch(SQLException e)被激活,但我並沒有看到異常,因爲這段代碼在webservice的服務器端運行,只有「ris」被返回給客戶端。 – tutak

回答

0

我通過查看服務器日誌找到了答案,由@ Stephen C在評論中建議,錯誤是由於拒絕執行查詢造成的,outter循環傳遞的是不同的值while其他值保持不變,但由outter傳遞的值不包含表的主鍵,因此查詢實際上是重複的。

1

我還沒有嘗試你的程序的邏輯,但我會建議你看看Reusing a PreparedStatement multiple times

我從來沒有使用重置準備語句的參數,而無需再次抓住了實例的情況下(poolpreparedstatement可用於高速緩存該聲明)。這可能是這裏的問題

+0

我需要preparedstatement運行(sintom.lengh * selec.length)* sexarra.length times where sexarra.length == 2。但outter循環只能運行一次(sintom.length * selec.length)* 1次。 – tutak

+0

我的建議是在每個ps.update之後關閉並加載準備好的語句。 – Fazal

+0

謝謝,但我解決了這個問題。我不能將它標記爲明天應答,因爲它不會允許我這樣做。 – tutak