MySQL,在Java应用程序中使用JDBC-结果集看似空,但查询格式良好

MySQL,在Java应用程序中使用JDBC-结果集看似空,但查询格式良好,java,mysql,sql,jdbc,Java,Mysql,Sql,Jdbc,我收到错误消息(java.sql.SQLException)java.sql.SQLException:在结果集开始之前 当我试图从MySQL数据库获取记录时。这是我正在使用的代码: public TimelineJDBC(String name, String startTime){ final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; final String DB_URL = "jdbc:mysq

我收到错误消息
(java.sql.SQLException)java.sql.SQLException:在结果集开始之前
当我试图从MySQL数据库获取记录时。这是我正在使用的代码:

public TimelineJDBC(String name, String startTime){          
      final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
      final String DB_URL = "jdbc:mysql://localhost/TimeLineDB";
      final String USER = "root";
      final String PASS = "XXXX";
    try{
       Class.forName("com.mysql.jdbc.Driver");
       Connection con = DriverManager.getConnection(DB_URL, USER, PASS);

       String sql= "SELECT * FROM TIMELINE WHERE NAME= 'MyLife2' AND STARTTIME= '2008-02-01';";
        Statement st = con.createStatement();
        ResultSet rs = st.executeQuery(sql);

        this.timeline.setId(rs.getInt("ID"));
        this.timeline.setName(rs.getString("NAME"));
        this.timeline.setDescriprion(rs.getString("DESCRIPTION"));
        this.timeline.setStartTime(rs.getString("STARTTIME"));
        this.timeline.setEndTime(rs.getString("ENDTIME"));
        this.timeline.setPicture(rs.getString("PICTURE"));
        TimeUnit enumVal =  TimeUnit.valueOf(rs.getString("SCALE"));
        this.timeline.setScale(enumVal);

    }
    catch(SQLException ex){
        System.err.println("Error in retrieving a timeline record from database:"+ ex.getMessage());
    }
    catch (Exception e){
         System.err.println(e.getMessage()); 
    }  
}
一旦尝试读取结果集
this.timeline.setId(rs.getInt(“ID”)
抛出此SQLException:
(java.sql.SQLException)java.sql.SQLException:在结果集开始之前

我知道您必须转到下一个结果集(
rs.next();
)的问题,但这似乎没有帮助,因为下一个结果集为空。 以下是显示初始结果集中返回内容的屏幕截图:

尝试在同一数据库上手动运行查询时,会形成正确的结果集,因此问题似乎不在于数据库。

您应该使用

while (rs.next()) { // for multiple rows
// get from rs here
}

你应该使用

while (rs.next()) { // for multiple rows
// get from rs here
}

如果你保留这个而不是那个,它会工作的


如果保留此选项而不是该选项,则它将起作用

您必须调用
ResultSet.next()
,然后才能访问数据
ResultSet.next()
不返回“下一个结果集”。它返回一个布尔值,指示是否有另一行可用。你似乎把这和
语句混淆了。getMoreResults()
我同意上面的海报所说的。只需添加一点-如果结果集为空,那么您可能会遇到另一个问题。先照他们说的做,然后再报告。当你使用A.Agarwal的溶液时会发生什么?它看起来是正确的。默认情况下,结果集光标将指向结果的第一行之前。调用ResultSet.next()时,只有内部ResultSet光标将移动到下一行。这个调用返回下一行是否可用。因此,请确保根据用户3663519答案上的注释调用rs.next(),这似乎不再是检索结果集的问题,而是该集为空,即使手动完成的查询显然返回了正确的结果。在访问数据之前,必须调用
ResultSet.next()
ResultSet.next()
不返回“下一个结果集”。它返回一个布尔值,指示是否有另一行可用。你似乎把这和
语句混淆了。getMoreResults()
我同意上面的海报所说的。只需添加一点-如果结果集为空,那么您可能会遇到另一个问题。先照他们说的做,然后再报告。当你使用A.Agarwal的溶液时会发生什么?它看起来是正确的。默认情况下,结果集光标将指向结果的第一行之前。调用ResultSet.next()时,只有内部ResultSet光标将移动到下一行。这个调用返回下一行是否可用。因此,请确保根据user3663519答案上的注释调用rs.next(),这似乎不再是检索结果集的问题,而是该集为空,即使手动完成的查询显然返回了正确的结果。我使用了该循环,控件进入循环,但又在行之后“this.timeline.setId(rs.getInt(“ID”));“将出现一个错误,即:“e=(java.lang.NullPointerException)java.lang.NullPointerException”我使用了该循环,该控件进入循环中,但再次位于“this.timeline.setId(rs.getInt(“ID”)”行之后;“将出现一个错误:“e=(java.lang.NullPointerException)java.lang.NullPointerException”
while(rs.next()) {

    this.timeline.setId(rs.getInt("ID"));

    this.timeline.setName(rs.getString("NAME"));
    this.timeline.setDescriprion(rs.getString("DESCRIPTION"));
    this.timeline.setStartTime(rs.getString("STARTTIME"));
    this.timeline.setEndTime(rs.getString("ENDTIME"));
    this.timeline.setPicture(rs.getString("PICTURE"));

    TimeUnit enumVal =  TimeUnit.valueOf(rs.getString("SCALE"));

    this.timeline.setScale(enumVal);

}