为什么ResultSet不为null,但我无法从ResultSet获取数据

时间:2013-04-22 11:49:29

标签: java mysql

public List<Course> searchCourse(String name) {
        List<Course> list = null;
        Course course = null;
        PreparedStatement pstmt = null; 
        ResultSet rs = null,rs1 = null;

        String sql = "select username,course_name from view_teacourse where username=? or course_name=? ";

        try{
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, name);
            pstmt.setString(2, name);
            rs = pstmt.executeQuery();
            while(next()){
                String sql1 = "select * from courseinfo where course_name=?";
                pstmt.setString(1, rs.getString("cousre_name"));
                rs1 = pstmt.executeQuery();
                while(rs1.next()){
                    course.setCourseid(rs.getInt("course_id"));
                    course.setCourseName(rs1.getString("course_name"));
                    course.setCourseScheme(rs.getString("course_scheme"));
                    course.setCourseBook(rs.getString("course_book"));
                    course.setCourseTerm(rs.getString("course_term"));
                    course.setIntroduction(rs.getString("introduction"));
                    course.setStartTime(rs.getTimestamp("start_time"));
                    course.setEndTime(rs.getTimestamp("end_time"));
                    course.setValidation(rs.getBoolean("validation"));
                    course.setCourseType(rs.getInt("coursetypeid"));
                    list.add(course);
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            DBBase.releaseResultSet(rs1);
            DBBase.releaseResultSet(rs);
            DBBase.releaseStatement(pstmt);
            DBBase.releaseConnection(conn);
        }
        return list;
    }

rs.next()的值变为虚假。它不能进入​​while循环。但如果我写rs.wasNull()所以我再次弄错了。所以我很困惑。我可以在我的数据库中使用相同的SQL获得正确的结果。当它在java文件中时它不起作用!我找不到哪里错了!

3 个答案:

答案 0 :(得分:5)

while(next()){需要while(rs.next()){,不是吗?

(确实如此,但@ duffymo的答案是你应该注意的答案)

答案 1 :(得分:1)

你可以用这种方式编写代码,但这是一个经典的(n + 1)延迟陷阱。随着外部结果集的大小增加,它会越来越差。

如果您学习如何正确编写JOIN,也可以将所有数据带回一个网络中。

如果你必须这样做,我会创建两个PreparedStatement实例:一个用于外部循环,另一个用于内部循环。

答案 2 :(得分:0)

这肯定是一个错字:

pstmt.setString(1, rs.getString("cousre_name"));

您似乎也没有向null分配除course之外的任何内容。 Java的明确分配规则是你的朋友; null不是。

您确定正好您正在运行的代码吗?