结果集显示为空,但 table 中至少有 1 条记录

ResultSet showing empty but there is at least 1 record in the table

问题 我的结果集是空的,但我知道 table ("tblStudents")?

中至少有 1 条记录

代码 :

package smartdatabase;

/**
 *
 * @author travi
 */
import java.sql.*;

public class Conn {

    private Connection connect = null;
    private Statement stmt = null;

    public Conn() {
    }

    public void getStudents() {
        try {

            Class.forName("org.apache.derby.jdbc.ClientDriver");
            connect = DriverManager.getConnection("jdbc:derby://localhost:1527/SmartData", "root", 
"password");
            String sql;
            sql = "SELECT FirstName, Surname FROM tblStudents";
            stmt = connect.createStatement();
            ResultSet rs = stmt.executeQuery(sql);

            if (rs.next()) {
                String Firstname = rs.getString("Firstname");
                String Surname = rs.getString("surname");
                System.out.println(Firstname + "    " + Surname);
            }else{
                System.out.println("Empty ResultSet");
            }
        } catch (SQLException se) {
            se.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

我试过检查区分大小写,但似乎不是问题所在。

我也试过 ResultSet rs = stmt.executeQuery(sql); 但没有任何改变。有什么想法吗?

rs.next()方法会将当前对象的指针移动到下一行。

因此,当您放置条件 if (rs.next()) 时,指针仅指向下一行,该行为空,正如您所说的,数据库中有一行条目。

第一次调用 next() 方法时,结果集 pointer/cursor 将移至第一行。第二次调用 next() 方法时,结果集游标将移动到第二行。这样就过去了。

您可以调用 first() or beforeFirst() 方法将 ResultSet 游标重置回第一行。

您可以在以下位置找到更多说明:ResultSet---isBeforeFirst()---AND--first()

现在检查是否为空需要按下面的方式实现,将光标移动到第一个位置,如果结果集为空则return false:

选项 1:

  if (!rs.first()) {
      System.out.println("Empty ResultSet");
  } else {
      do {
          String Firstname = rs.getString("Firstname");
          String Surname = rs.getString("surname");
          System.out.println(Firstname + "    " + Surname);
      } while (rs.next());
  }

更新:

选项 2:

if (!rs.isBeforeFirst()) {    
    System.out.println("Empty ResultSet"); 
} else {
      do {
          String Firstname = rs.getString("Firstname");
          String Surname = rs.getString("surname");
          System.out.println(Firstname + "    " + Surname);
      } while (rs.next());
}

选项 3:

if (!rs.isBeforeFirst() && rs.getRow() == 0) {    
    System.out.println("Empty ResultSet"); 
} else {
      do {
          String Firstname = rs.getString("Firstname");
          String Surname = rs.getString("surname");
          System.out.println(Firstname + "    " + Surname);
      } while (rs.next());
}

更新 2:

对于 DERBY 数据库,使用 createStatement 中的以下参数:

// Replace : stmt = connect.createStatement();
stmt = connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
                               ResultSet.CONCUR_READ_ONLY);

ResultSet rs = stmt.executeQuery(sql);

然后使用上面提到的选项1