【问题标题】:resultset iterating only one time on while loop结果集在while循环中仅迭代一次
【发布时间】:2015-09-20 21:05:18
【问题描述】:

所以我使用Statement 访问我的java 代码中的mySql 数据库来执行我的查询并将返回的ResultSet 保存在ResultSet 对象中,然后使用相同的ResultSet 对象,我从结果并简单地打印出每一行的数据。

代码如下:

public class DBConnect {
    private Connection conn;
    private Statement st;
    private ResultSet rs;

    public DBConnect(){
        try{
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/unal_grades", "root", "");
            st = conn.createStatement();
        }catch(Exception ex){
            System.out.println("Error: " + ex);
        }
    }

public ArrayList<Semester> getSemesters(){
    try{
        ArrayList<Semester> semesters = new ArrayList<Semester>();
        String query = "Select * from semester";
        rs = st.executeQuery(query);
        System.out.println("semesters");
        while(rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            float average = rs.getFloat("average");
            boolean active = rs.getBoolean("active");

            System.out.println(name+" / "+average+" / "+active);
            Semester semester = new Semester(id, name, average, active);
            semester.setClasses(getClasses(semester));
            semesters.add(semester);
        }
        System.out.println();
        return semesters;
    }catch(Exception ex){
        System.out.println("Error: " + ex);
    }
    return null;
}

我的问题是,在 while 循环中,rs.next() 语句仅在第一次迭代时返回 true。换句话说,当实际有很多行时,它只会打印我的表在数据库中的第一行。

调试时,如果我在实际运行之前检查rs.next(),当我在第一次迭代中实际运行它时,它会进入循环并打印出我的表格的第二行。

非常感谢您的帮助。

【问题讨论】:

  • 你的代码没有编译:你还没有初始化st变量。
  • 您确定您的查询返回的不止一行吗?
  • @ali786 我想,这就是他对问题的调试部分所说的话。如果他在调试器中检查rs.next(),则找到第二行。
  • @SantiagoAlvarez 但是你确定你的 while 块没有异常吗? (我不认为那是你的全部代码)。我无法想象为什么你不应该得到所有的行。
  • @TagirValeev 谢谢我解决了这个问题,但这是帖子上的错误。

标签: java mysql jdbc resultset


【解决方案1】:

我的问题是,在getClasses() 方法中,我还修改了rs 变量,所以在while 循环中,变量不一样,所以它返回false。

解决方案是在每个方法中将ResultSet rs 变量设为局部变量。

像这样:

public class DBConnect {
    private Connection conn;

    public DBConnect(){
        try{
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/unal_grades", "root", "");
        }catch(Exception ex){
             System.out.println("Error: " + ex);
        }
    }

    public ArrayList<Semester> getSemesters(){
        ResultSet rs;
        try{
            Statement st = conn.createStatement();
            ArrayList<Semester> semesters = new ArrayList<Semester>();
            String query = "Select * from semester";
            rs = st.executeQuery(query);
            System.out.println("semesters");
            while(rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                float average = rs.getFloat("average");
                boolean active = rs.getBoolean("active");

                System.out.println(name+" / "+average+" / "+active);
                Semester semester = new Semester(id, name, average, active);
                semester.setClasses(getClasses(semester));
                semesters.add(semester);
            }
            System.out.println();
            return semesters;
        }catch(Exception ex){
            System.out.println("Error: " + ex);
        }
        return null;
    }
}

【讨论】:

  • 肯定...这就是为什么我怀疑您之前编写的示例没有逻辑错误或系统错误...
【解决方案2】:
Statement st;
ResultSet rs;
try{
  String query = "Select * from semester";
  st = con.createStatement();
  rs = st.executeQuery(query);
  System.out.println("semesters");

  while(rs.next()){
    int id = rs.getInt("id");
    String name = rs.getString("name");
    float average = rs.getFloat("average");
   boolean active = rs.getBoolean("active");

    System.out.println(name+" / "+average+" / "+active);
}

System.out.println();
} catch(Exception ex){
   System.out.println("Error: " + ex);
}  

【讨论】:

  • @SantiagoAlvarez 他添加了st = con.createStatement(); (我认为您在原始代码中有什么。否则您的 Statement 变量将不会被初始化)
猜你喜欢
  • 2016-06-19
  • 2015-03-23
  • 1970-01-01
  • 2011-09-13
  • 2012-05-28
  • 2023-04-07
  • 1970-01-01
  • 2014-10-11
  • 2016-09-26
相关资源
最近更新 更多