web-dev-qa-db-ja.com

取得したa Java ResultSetが空かどうかを確認する方法は?

Class.forName("org.sqlite.JDBC");
Connection conn =
    DriverManager.getConnection("jdbc:sqlite:userdata.db");
Statement stat = conn.createStatement();

ResultSet rs = stat.executeQuery("SELECT * from table WHERE is_query_processed = 0;");

int rowcount = rs.getRow(); 
System.out.println("Row count = "+rowcount); // output 1

rs.first(); // This statement generates an exception

なぜそうなのですか?

12
Bruce

私が通常使用するパターンは次のとおりです。

boolean empty = true;
while( rs.next() ) {
    // ResultSet processing here
    empty = false;
}

if( empty ) {
    // Empty result set
}
20
Colin Gislason

これを行う簡単な方法は次のとおりです。

_public static boolean isResultSetEmpty(ResultSet resultSet) {
    return !resultSet.first();
}
_

警告

これにより、カーソルが先頭に移動します。しかし、それが空かどうかをテストしたいだけなら、とにかくまだ何もしていないでしょう。

あるいは

処理を行う前に、すぐにfirst()メソッドを使用してください。 ResultSet rs = stat.executeQuery( "SELECT * from table WHERE is_query_processed = 0;");

_if(rs.first()) {
    // there's stuff to do
} else {
    // rs was empty
}
_

参考文献

ResultSet(Java Platform SE 6)

5
jasonmp85

あなたもこれを行うことができます:

rs.last();
int numberOfRows = rs.getRow();
if(numberOfRows) {
    rs.beforeFirst();
    while(rs.next()) {
        ...
    }
}
3
karim79

行数を決定するためにカーソルを前後にシフトすることは、通常のJDBCの方法ではありません。通常のJDBCの方法では、ResultSetをそれぞれテーブル行エンティティを表す値オブジェクトのListにマップしてから、Listメソッドを使用して行があるかどうかを判断します。 。

例えば:

_List<User> users = userDAO.list();

if (users.isEmpty()) {
    // It is empty!
if (users.size() == 1) {
    // It has only one row!
} else {
    // It has more than one row!
}
_

ここで、list()メソッドは次のようになります。

_public List<User> list() throws SQLException {
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    List<User> users = new ArrayList<User>();

    try {
        connection = database.getConnection();
        statement = connection.createStatement();
        resultSet = statement.executeQuery(SQL_LIST);
        while (resultSet.next()) {
            User user = new User();
            user.setId(resultSet.getLong("id"));
            user.setName(resultSet.getString("name"));
            // ...
            users.add(user);
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
        if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }

    return users;
}
_

他のJDBCの例については、 この回答 も参照してください。

1
BalusC

CLOSE_CURSORS_AT_COMMIT

public static final int CLOSE_CURSORS_AT_COMMIT

The constant indicating that ResultSet objects should be closed when the method Connection.commit is called. 
1
santosh kumar t

これで試してください:

ResultSet MyResult = null;
MyResult = Conexion.createStatement().executeQuery("Your Query  Here!!!");
MyResult.last();
int NumResut = MyResult.getRow();MyResult.beforeFirst();
//Follow with your other operations....

このようにして、通常どおりに作業できるようになります。

1
chepe lucho
 while (results.next())

結果セットを反復処理するために使用されます。したがって、results.next()は、空の場合はfalseを返します。

1
Inv3r53

実行がwhileループに入らないのはなぜですか?

ResultSetが空の場合、rs.next()メソッドはfalseを返し、whileループの本体は行番号(カウントではない)に関係なく入力されません。rs.getRow()は戻ります。コリンズの例は機能します。

1
stacker

結果セットオブジェクトをStringオブジェクトに変換して、空かどうかを確認できるかもしれません。

`if(resultset.toString().isEmpty()){
     // containg null result
 }
 else{
     //This conains the result you want
 }`
0
Chamod

これは、最初のレコードをスキップせずに、空かどうかをチェックします

if (rs.first()) {
    do {
        // ResultSet is not empty, Iterate over it
    } while (rs.next());
} else {
    // ResultSet is empty
}
0
Ullauri