这不是一个很简单的手术吗?但是,我看到既没有size()也没有length()方法。


当前回答

当使用rs.last()时,我得到了一个异常

if(rs.last()){
    rowCount = rs.getRow(); 
    rs.beforeFirst();
}

:

java.sql.SQLException: Invalid operation for forward only resultset

因为默认情况下它是ResultSet。TYPE_FORWARD_ONLY,这意味着只能使用rs.next()

解决方案是:

stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY); 

其他回答

为列命名。

String query = "SELECT COUNT(*) as count FROM

引用该列从ResultSet对象到int,并从那里做你的逻辑。

PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, item.getProductId());
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
    int count = resultSet.getInt("count");
    if (count >= 1) {
        System.out.println("Product ID already exists.");
    } else {
        System.out.println("New Product ID.");
    }
}
theStatement=theConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

ResultSet theResult=theStatement.executeQuery(query); 

//Get the size of the data returned
theResult.last();     
int size = theResult.getRow() * theResult.getMetaData().getColumnCount();       
theResult.beforeFirst();

今天,我用了这个逻辑,为什么我不知道得到RS的计数。

int chkSize = 0;
if (rs.next()) {
    do {  ..... blah blah
        enter code here for each rs.
        chkSize++;
    } while (rs.next());
} else {
    enter code here for rs size = 0 
}
// good luck to u.

这是一种简单的行计数方法。

ResultSet rs = job.getSearchedResult(stmt);
int rsCount = 0;

//but notice that you'll only get correct ResultSet size after end of the while loop
while(rs.next())
{
    //do your other per row stuff 
    rsCount = rsCount + 1;
}//end while

(速度考虑)

很多人在这里建议ResultSet.last(),但你需要打开连接作为一个ResultSet。TYPE_SCROLL_INSENSITIVE,对于Derby嵌入式数据库,它比ResultSet.TYPE_FORWARD_ONLY慢10倍。

根据我对嵌入式Derby和H2数据库的微型测试,在SELECT之前调用SELECT COUNT(*)要快得多。

下面是我的代码和基准测试的更详细信息