2012-05-16 4 views
0
Comment comment; 
    ArrayList<Comment> commentList = null; 

    try{ 
     ConnectionFactory myFactory = ConnectionFactory.getFactory(); 
     Connection conn = myFactory.getConnection(); 
     int i = 1; int j = 1; int k = 1; 

     PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM COMMENT WHERE deletestatus = 0 and workid = ?"); 

     PreparedStatement pstmtLName = conn.prepareStatement("SELECT * FROM LEADER WHERE leaderid = ?"); 

     PreparedStatement pstmtMName = conn.prepareStatement("SELECT * FROM MEMBER WHERE memberid = ?"); 

     pstmt.setInt(i++, Integer.parseInt(projid)); 

     ResultSet rs = pstmt.executeQuery(); 
     System.out.print(rs); 
     commentList = new ArrayList<Comment>(); 
     while(rs.next()) 
      { 
       comment = new Comment(); 
       comment.setDetails(rs.getString("details")); 
       comment.setDateadded(rs.getTimestamp("dateadded")); 
       comment.setUrgency(rs.getInt("urgency")); 



       if(rs.getInt("leaderid") != 0){ 
        comment.setLeaderid(rs.getInt("leaderid")); 

        pstmtLName.setInt(j++, rs.getInt("leaderid")); 

        ResultSet rs2 = pstmtLName.executeQuery(); 


        if(rs2.next()){ 
        comment.setFullname(rs2.getString("firstname") +" " + rs2.getString("lastname")); 
        } 
       } 
       if(rs.getInt("memberid") != 0) { 
        comment.setMemberid(rs.getInt("memberid")); 

        System.out.print("in the loop"); 

        pstmtMName.setInt(j++, rs.getInt("memberid")); 
        ResultSet rs3 = pstmtMName.executeQuery(); 

        if(rs2.next()){ 
        comment.setFullname(rs3.getString("firstname") +" " + rs3.getString("lastname")); 
        } 

       } 

       comment.setProjid(Integer.parseInt(projid)); 
       commentList.add(comment); 
      } 



     return commentList; 
    } 

위 코드의 문제점은 결과 집합의 첫 번째 결과 만 제공한다는 것입니다.불완전한 ResultSet 데이터

WHILE(RS.NEXT) 절에있는 IF 절을 모두 제거했을 때 필요한 모든 결과가 반환되었지만 불완전한 정보가 반환되었습니다. if 문 안에 쿼리가 필요하기 때문입니다.

여러분이 정확한 문제를 알고 계신다면 도움을 요청하십시오. 더 자세한 정보가 필요한 경우 알려주십시오. 고맙습니다!

답변

2

여기에, 문제는 J의 값은 루프 반복까지 각각의 진정한 조건에 대해 증가 할 것

pstmtLName.setInt(j++, rs.getInt("leaderid")); 
pstmtMName.setInt(j++, rs.getInt("memberid")); 

에 보인다. 따라서 prepadred 문의 parameterIndex가 증가합니다.

그것은 당신이 int k를 정의하지만, 그것을 사용하지 않은

pstmtLName.setInt(1, rs.getInt("leaderid")); 
pstmtMName.setInt(1, rs.getInt("memberid")); 
+0

선언문이이 컨텍스트에서 잘못된 위치에있었습니다. 이 솔루션은 완벽하게 작동했습니다! 그 덕분에! :) – gwafito

+0

당신은 환영합니다 –

2

해야한다. 이 매개 변수를 사용하여 memberid 매개 변수를 설정하려고한다고 가정합니다.

pstmtMName.setInt(k++, rs.getInt("memberid")); 

로 변경

pstmtMName.setInt(j++, rs.getInt("memberid")); 

과 작동해야한다. 쿼리에서 볼 하나 개의 매개 변수 표시 ?있을 때 명령문의 PARAM 값을 설정 i++, j++k++를 사용하는 이유

는 그리고 궁금하다. 직접 pstObject.setInt(1, ...을 사용해야합니다. 그렇지 않으면 rsleaderid != 0memberid != 0 인 레코드보다 많은 레코드를 가져 오는 경우 마커 인덱스의 증가 (예 : pstObject.setInt(2, ...)가 쿼리 케이스에 잘못된 매개 변수이며, SQLException을 던집니다.

while 루프에서 동일한 pstObject을 반복적으로 사용하고 있으므로 pstObject.clearParameters()을 사용하여 현재 매개 변수 값을 지울 것을 제안합니다. 이 옵션은 선택 사항이지만 현재 매개 변수 값이 사용하는 리소스를 즉시 해제하는 것이 유용한 경우도 있습니다.

+0

잘못 선언에 사과드립니다. 나는 정말로 k가 필요 없다. 나는 코드가 IF 절 중 하나만으로가는 것을 기대하지만, 데이터베이스의 어떤 이상이 발생하는 경우를 대비하여 오류를 만들지 않았다. 오류에 대한 마크 업이 적을 것이다. pstObject 조언을 주셔서 감사합니다. 거기에 넣을거야! 감사! – gwafito