2013-08-18 49 views
1

我有一个非常基本的代码位,执行select查询并返回一个布尔值,取决于结果集是否为空。在Java中,ResultSet可以为'null'吗?

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())来检查吗?

回答

8

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

Returns:

  • a ResultSet object that contains the data produced by the given query; never null

强调我的。

Should I be using while (rs.next()) to check instead?

是的。

+0

谢谢。我从来没有真正阅读API,我想我应该更频繁地这样做... – DeaIss

+2

@oOTesterOo。当然。遇到问题时,您应该首先访问API。这就是他们在那里。 –

5

不,ResultQuery返回的ResultQuery方法可以永不为零

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

所以,你的情况,你甚至不需要检查,而只是return rs.first();

注:但是如果你打算进一步处理的结果集,你应该将光标移动之前,首先否则你将跳过第一行遍历ResultSet。

例如:

if (!rs.first) { 
    // throw error or return 
} 

// reset the cursor 
rs.beforeFirst(); 

// continue processing the ResultSet further ... 
2

结果集将不能为null之前,除非:

1.It is initialized to null and done nothing else,

2.If the statement on which execute query is written is not correct(sql exception will occur and initialization will not happen).

这是无关紧要的这个问题,但将作为我这样的人小费。

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

我遇到了这个错误,这就是我写作的原因。这可能是一个很大的问题,当我们做一个批处理过程,一出50000的执行导致异常(在我的情况:

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

此错误是造成各地20000迭代)导致事与愿违的结果。

相关问题