如何在Java中使用ResultSet获取行计数?

68 java jdbc resultset

我正在尝试创建一个简单的方法,接收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("--------------------------------------------------------");
    }
Run Code Online (Sandbox Code Playgroud)

我试过这个:

int size = 0;
try {
    resultSet.last();
    size = resultSet.getRow();
    resultSet.beforeFirst();
}
catch(Exception ex) {
    return 0;
}
return size;
Run Code Online (Sandbox Code Playgroud)

但是我说错了 com.microsoft.sqlserver.jdbc.SQLServerException: The requested operation is not supported on forward only result sets.

提前感谢指针!

Luk*_*der 58

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

connection.prepareStatement(sql, 
  ResultSet.TYPE_SCROLL_INSENSITIVE, 
  ResultSet.CONCUR_READ_ONLY);
Run Code Online (Sandbox Code Playgroud)

这将以您可以回放光标的方式准备语句.这也记录在ResultSet Javadoc中

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

SELECT my_table.*, count(*) over () total_rows
FROM my_table
WHERE ...
Run Code Online (Sandbox Code Playgroud)


Fat*_*n P 34

你的sql语句创建代码可能就像

statement = connection.createStatement();
Run Code Online (Sandbox Code Playgroud)

要解决"com.microsoft.sqlserver.jdbc.SQLServerException:前转结果集不支持请求的操作"异常更改上面的代码

statement = connection.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE, 
    ResultSet.CONCUR_READ_ONLY);
Run Code Online (Sandbox Code Playgroud)

经过上述更改后即可使用

int size = 0;
try {
    resultSet.last();
    size = resultSet.getRow();
    resultSet.beforeFirst();
}
catch(Exception ex) {
    return 0;
}
return size;
Run Code Online (Sandbox Code Playgroud)

获得行数


Jav*_*Man 23

Statement s = cd.createStatement();
ResultSet r = s.executeQuery("SELECT COUNT(*) AS rowcount FROM FieldMaster");
r.next();
int count = r.getInt("rowcount");
r.close();
System.out.println("MyTable has " + count + " row(s).");
Run Code Online (Sandbox Code Playgroud)

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

Sqlite在JDBC中不支持.

resultSet.last();
size = resultSet.getRow();
resultSet.beforeFirst();
Run Code Online (Sandbox Code Playgroud)

所以当时使用这个解决方案.

谢谢..


Sug*_*lai 8

SELECT COUNT(*) FROM ...改为查询.


小智 5

我刚做了一个getter方法.

public int getNumberRows(){
    try{
       statement = connection.creatStatement();
       resultset = statement.executeQuery("your query here");
       if(resultset.last()){
          return resultset.getRow();
       } else {
           return 0; //just cus I like to always do some kinda else statement.
       }
    } catch (Exception e){
       System.out.println("Error getting row count");
       e.printStackTrace();
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 所以你执行一个完整的查询只是为了获得计数?更好地动态编辑SQL查询,使其仅返回COUNT (6认同)