ResultSet显示为空,但表中至少有1条记录

问题描述

问题我的ResultSet为空,但我知道表中至少有1条记录(“ tblStudents”)?

代码

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()方法时,结果集指针/游标将移至第一行。再次第二次调用next()方法,结果集光标将移至第二行。通过这种方式。

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

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

现在要检查是否为空,您需要按以下方式实现,将光标移到第一个位置,如果结果集为空,它将返回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