如何使用Java中的结果集获取行计数?

2022-08-31 11:44:20

我正在尝试创建一个简单的方法,该方法将 ResultSet 作为参数接收,并返回一个包含 ResultSet 行计数的 int。这是这样做的有效方法还是不那么有效?

int size = 0;
    try {
        while(rs.next()){
            size++;
        }
    }
    catch(Exception ex) {
        System.out.println("------------------Tablerize.getRowCount-----------------");
        System.out.println("Cannot get resultSet row count: " + ex);
        System.out.println("--------------------------------------------------------");
    }

我试过这个:

int size = 0;
try {
    resultSet.last();
    size = resultSet.getRow();
    resultSet.beforeFirst();
}
catch(Exception ex) {
    return 0;
}
return size;

但是我得到了一个错误,说

com.microsoft.sqlserver.jdbc.SQLServerException: 
The requested operation is not supported on forward only result sets.

答案 1

如果您有权访问生成此结果集的预准备语句,则可以使用

connection.prepareStatement(sql, 
  ResultSet.TYPE_SCROLL_INSENSITIVE, 
  ResultSet.CONCUR_READ_ONLY);

这将以一种可以倒回游标的方式准备语句。这也记录在 ResultSet Javadoc 中

但是,通常,对于大型结果集,转发和倒带游标的效率可能非常低下。SQL Server中的另一个选项是直接在SQL语句中计算总行数:

SELECT my_table.*, count(*) over () total_rows
FROM my_table
WHERE ...

答案 2
Statement s = cd.createStatement();
ResultSet r = s.executeQuery("SELECT COUNT(*) AS recordCount FROM FieldMaster");
r.next();
int count = r.getInt("recordCount");
r.close();
System.out.println("MyTable has " + count + " row(s).");

有时JDBC不支持以下方法给出错误,如“TYPE_FORWARD_ONLY”使用此解决方案

Sqlite 在 JDBC 中不受支持。

resultSet.last();
size = resultSet.getRow();
resultSet.beforeFirst();

所以在那个时候使用这个解决方案。


推荐