如何确定获得的Java ResultSet是否为空?

时间:2010-05-30 13:30:30

标签: java database jdbc 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

为什么会这样?

10 个答案:

答案 0 :(得分:18)

我通常使用的模式如下:

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

if( empty ) {
    // Empty result set
}

答案 1 :(得分:5)

这是一个简单的方法:

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)

答案 2 :(得分:3)

您也可以这样做:

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

答案 3 :(得分:1)

 while (results.next())

用于迭代结果集。所以results.next()如果为空则返回false。

答案 4 :(得分:1)

  

为什么执行不进入   while loop?

如果ResultSet为空,rs.next()方法返回false,并且无论rownumber(不计数)rs.getRow()返回,都不会输入while循环的主体。科林斯的例子很有用。

答案 5 :(得分:1)

向前和向后移动光标以确定行数不是正常的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;
}

另请参阅this answer了解其他JDBC示例。

答案 6 :(得分:1)

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. 

答案 7 :(得分:1)

试试这个:

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

这样你就能正常工作。

答案 8 :(得分:0)

可能是您可以将结果集对象转换为String对象并检查它是否为空。

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

答案 9 :(得分:0)

在不跳过第一条记录时检查它是否为空

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