【问题标题】:Can a ResultSet be 'null' in Java?Java 中的 ResultSet 可以为“null”吗?
【发布时间】:2013-08-18 16:35:59
【问题描述】:

我有一段非常基本的代码,它执行一个选择查询并根据结果集是否为空返回一个布尔值。

public boolean checkIfUserHasPreferences(String username){
        ResultSet rs = null;
        boolean checkBoolean = false;

        try {
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
            con = DriverManager.getConnection(Messages.getString("OracleUserManagement.0"), Messages.getString("OracleUserManagement.1"), Messages.getString("OracleUserManagement.2")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

            PreparedStatement statement = con.prepareStatement("SELECT USERNAME FROM USER_PREFERENCES WHERE USERNAME = ?"); 
            statement.setString(1, username);
            rs = statement.executeQuery();
            if (rs == null){
                System.out.println("I checked it was true!");
                checkBoolean = true;
            } else {
                System.out.println("I checked it was false!");
                checkBoolean = false;
            }

            con.commit();

            con.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return checkBoolean;
    }

让我困惑的是,即使表/数据库是空的,它总是打印出“我检查它是假的!”。

这是因为即使结果集返回 0 行,它也不 = null?我应该改用 while (rs.next()) 来检查吗?

【问题讨论】:

    标签: java sql jdbc null resultset


    【解决方案1】:

    您可以查看Statement#executeQuery() 方法的API。它说:

    返回:

    • 一个 ResultSet 对象,包含给定查询产生的数据; 从不为空

    强调我的。

    我应该改用 while (rs.next()) 来检查吗?

    是的。

    【讨论】:

    • @oOTesterOo。当然。遇到问题时,您应该首先访问 API。这就是他们的目的。
    【解决方案2】:

    不,executeQuery(java.lang.String) 方法返回的 ResultSet永远不能为空

    此外,检查 ResultSet 是否为空的标准方法是尝试使用其 first() 将其光标设置为第一行,如果返回 false,则表明 ResultSet 为空。

    因此,在您的情况下,您甚至不需要检查return rs.first();

    例如:

    if (!rs.first()) {
        // handle empty set: throw error or return
    }
    
    // continue processing the ResultSet further
    do {
        // ...
    } while (rs.next());
    

    【讨论】:

    • 步骤太多,只检查rs.next()然后处理游标代替
    • @kidnan1991 该解决方案可让您处理您想对空结果集采取一些行动的场景
    【解决方案3】:

    结果集不会为空,除非:

    1.它被初始化为null,没有做任何其他事情,

    2.如果写执行查询的语句不正确(会出现sql异常,不会初始化)。

    这与这个问题无关,但可以作为像我这样的人的提示。

    当数据库操作在一个单独的类中完成时会发生这种情况,其中 statement.executeQuery() 在 try-catch 中给出,它没有 e.printStackTrace() 或任何其他日志记录机制。

    我遇到了这个错误,这就是我写作的原因。当我们执行批处理时,这可能是一个很大的问题,其中 50000 次执行中有一个会导致异常(在我的情况下:

    com.ibm.db2.jcc.a.SqlException:DB2 SQL 错误:SQLCODE:-805, SQLSTATE: 51002

    这个错误是在大约 20000 次迭代中引起的),这会导致不需要的结果。

    【讨论】:

      猜你喜欢
      • 2011-01-16
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      相关资源
      最近更新 更多