不完整的ResultSet数据

时间:2012-05-16 08:42:50

标签: java mysql jdbc prepared-statement resultset

    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;
     }

上面代码的问题在于它只返回结果集的第一个结果。

当我删除IF子句中的两个WHILE(RS.NEXT)子句时,它返回了所有需要的结果但不完整的信息,因为我还需要if语句中的查询。

如果你们知道确切的问题,请帮忙告诉我你们是否需要更多信息。谢谢!

2 个答案:

答案 0 :(得分:2)

在这里,问题似乎在

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

对于每个真实条件,j的值将增加,直到循环迭代。 因此,它增加了parameterIndex预先准备的声明。

应该是

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

答案 1 :(得分:2)

您已定义int k但未使用它。我假设你想用它来设置memberid参数 改变

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

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

它应该有效。

我想知道为什么在查询中只看到一个参数标记i++时,使用j++k++?来设置语句的参数值。您应该直接使用pstObject.setInt( 1, ...。否则,如果rs获取的记录多于leaderid != 0memberid != 0的记录,则会导致标记索引增加,例如pstObject.setInt( 2, ...,这是您的无效参数查询案例和投掷以及SQLException

由于您在while循环中重复使用相同的pstObject,我建议使用pstObject.clearParameters()清除当前参数值。虽然这是可选的,但在某些情况下,立即释放当前参数值使用的资源很有用。