【问题标题】:ResultSet showing empty but there is at least 1 record in the table结果集显示为空,但表中至少有 1 条记录
【发布时间】:2020-09-01 06:55:38
【问题描述】:

ISSUE 我的 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); 并没有改变任何东西。有什么想法吗?

【问题讨论】:

    标签: java database netbeans derby


    【解决方案1】:

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

    因此,当您放置条件 if (rs.next()) 时,指针仅指向下一行,因为您说过您在 DB 中有一个行条目,因此为空。

    第一次调用 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

    【讨论】:

    • 我试过你的代码,但我仍然有相同的输出发生
    • @Travopticat :它将是 rs.first() 。我已经更新了我的答案。请立即检查。
    • 另一个错误“这个方法只能在 ResultSet 对象上调用,因为它是可滚动的”
    • @Travopticat:您使用的是哪个数据库?方法rs.first()rs.beforeFirst() 可能并不总是有效。
    • @Travopticat :您是否尝试过答案中的选项 2。
    猜你喜欢
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    相关资源
    最近更新 更多