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
なぜそうなのですか?
私が通常使用するパターンは次のとおりです。
boolean empty = true;
while( rs.next() ) {
// ResultSet processing here
empty = false;
}
if( empty ) {
// Empty result set
}
これを行う簡単な方法は次のとおりです。
_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
}
_
あなたもこれを行うことができます:
rs.last();
int numberOfRows = rs.getRow();
if(numberOfRows) {
rs.beforeFirst();
while(rs.next()) {
...
}
}
行数を決定するためにカーソルを前後にシフトすることは、通常の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の例については、 この回答 も参照してください。
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.
これで試してください:
ResultSet MyResult = null;
MyResult = Conexion.createStatement().executeQuery("Your Query Here!!!");
MyResult.last();
int NumResut = MyResult.getRow();MyResult.beforeFirst();
//Follow with your other operations....
このようにして、通常どおりに作業できるようになります。
while (results.next())
結果セットを反復処理するために使用されます。したがって、results.next()は、空の場合はfalseを返します。
実行がwhileループに入らないのはなぜですか?
ResultSetが空の場合、rs.next()
メソッドはfalseを返し、whileループの本体は行番号(カウントではない)に関係なく入力されません。rs.getRow()
は戻ります。コリンズの例は機能します。
結果セットオブジェクトをStringオブジェクトに変換して、空かどうかを確認できるかもしれません。
`if(resultset.toString().isEmpty()){
// containg null result
}
else{
//This conains the result you want
}`
これは、最初のレコードをスキップせずに、空かどうかをチェックします
if (rs.first()) {
do {
// ResultSet is not empty, Iterate over it
} while (rs.next());
} else {
// ResultSet is empty
}