2013-08-18 76 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迭代)導致事與願違的結果。

相關問題