获取Java中ResultSet返回的行数

获取Java中ResultSet返回的行数,java,resultset,Java,Resultset,我使用了一个返回一定行数的ResultSet。我的代码是这样的: ResultSet res = getData(); if(!res.next()) { System.out.println("No Data Found"); } while(res.next()) { // code to display the data in the table. } if (!rs.next()) { //if rs.next()

我使用了一个返回一定行数的
ResultSet
。我的代码是这样的:

ResultSet res = getData();
if(!res.next())
{
    System.out.println("No Data Found");
}
while(res.next())
{
    // code to display the data in the table.
}
if (!rs.next()) {                            //if rs.next() returns false
                                             //then there are no rows.
    System.out.println("No records found");

}
else {
    do {
        // Get data from the current row and use it
    } while (rs.next());
}

是否有任何方法检查
结果集返回的行数
?或者我必须自己写吗?

你可以使用
do。。。while
循环而不是while循环,这样在执行循环后调用
rs.next()
,如下所示:

ResultSet res = getData();
if(!res.next())
{
    System.out.println("No Data Found");
}
while(res.next())
{
    // code to display the data in the table.
}
if (!rs.next()) {                            //if rs.next() returns false
                                             //then there are no rows.
    System.out.println("No records found");

}
else {
    do {
        // Get data from the current row and use it
    } while (rs.next());
}
或者在获取行数时自己计算行数:

int count = 0;

while (rs.next()) {
    ++count;
    // Get data from the current row and use it
}

if (count == 0) {
    System.out.println("No records found");
}
res.next()
方法将使用指向下一行的指针。在代码中,您将使用它两次,首先是if条件(光标移动到第一行),然后是while条件(光标移动到第二行)

所以,当您访问结果时,它从第二行开始。因此,显示的结果少了一行

您可以尝试以下方法:

if(!res.next()){ 
    System.out.println("No Data Found");  
}
else{
    do{
       //your code
    } 
    while(res.next());
}

首先,您应该创建可以通过命令移动光标的
语句

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
然后检索
结果集
,如下所示:

ResultSet rs = stmt.executeQuery(...);
将光标移动到最新的行并获取它:

if (rs.last()) {
    int rows = rs.getRow();
    // Move to beginning
    rs.beforeFirst();
    ...
}

然后rows变量将包含sql返回的行数

一个简单的
getRowCount
方法如下所示:

private int getRowCount(ResultSet resultSet) {
    if (resultSet == null) {
        return 0;
    }

    try {
        resultSet.last();
        return resultSet.getRow();
    } catch (SQLException exp) {
        exp.printStackTrace();
    } finally {
        try {
            resultSet.beforeFirst();
        } catch (SQLException exp) {
            exp.printStackTrace();
        }
    }

    return 0;
}

请注意,此方法需要一个对滚动敏感的结果集
,因此在创建连接时必须指定滚动选项。默认值为向前,使用此方法将引发异常。

区分结果集中0行或某些行的另一种方法:

ResultSet res = getData();

if(!res.isBeforeFirst()){          //res.isBeforeFirst() is true if the cursor
                                   //is before the first row.  If res contains
                                   //no rows, rs.isBeforeFirst() is false.

    System.out.println("0 rows");
}
else{
    while(res.next()){
        // code to display the rows in the table.
    }
}
如果必须知道给定ResultSet的行数,请使用以下方法获取:

public int getRows(ResultSet res){
    int totalRows = 0;
    try {
        res.last();
        totalRows = res.getRow();
        res.beforeFirst();
    } 
    catch(Exception ex)  {
        return 0;
    }
    return totalRows ;    
}

您可以按如下方式使用
res.previous()

ResulerSet res = getDate();
if(!res.next()) {
    System.out.println("No Data Found.");
} else {
    res.previous();
    while(res.next()) {
      //code to display the data in the table.
    }
}

您可以将结果集加载到TableModel中,然后创建使用该TableModel的JTable,然后使用table.getRowCount()方法。如果要显示查询结果,无论如何都必须这样做

ResultSet resultSet;
resultSet = doQuery(something, somethingelse);
KiransTableModel myTableModel = new KiransTableModel(resultSet);
JTable table = new JTable(KiransTableModel);
int rowCount;
rowCount = table.getRowCount;

您可以使用sql计数并从结果集中检索答案,如下所示:

Statment stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
                                     ResultSet.CONCUR_READ_ONLY);
ResultSet ct = stmt.executeQuery("SELECT COUNT(*) FROM [table_name]");
if(ct.next()){
   td.setTotalNumRows(ct.getInt(1));
}
在这里,我计算所有内容,但您可以轻松地修改SQL以基于标准进行计算

Statement st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=st.executeQuery("select * from emp where deptno=31");
rs.last();
System.out.println("NoOfRows: "+rs.getRow());
第一行代码表示我们可以移动结果集中的任何位置(到第一行或最后一行,或在第一行之前,而不需要从第一行开始逐行遍历,这需要时间)。第二行代码获取与我假设的查询匹配的记录(25条记录),第三行代码将光标移动到最后一行,最后一行代码获取当前行号,在我的例子中是25。如果没有记录,rs.last将返回0,getrow将光标移动到第一行之前,因此返回负值表示此my解决方案中的db中没有记录

 ResultSet rs=Statement.executeQuery("query");

    int rowCount=0;


    if (!rs.isBeforeFirst()) 
      {

           System.out.println("No DATA" );
        } else {
            while (rs.next()) {
                rowCount++; 
            System.out.println("data1,data2,data3...etc..");
            }
            System.out.println(rowCount);
            rowCount=0;
            rs.close();
            Statement.close();
      }

如果您的查询是这样的,请从tranbook中选择Count(*),然后执行此操作;System.out.println(rs.getInt(“计数(*))

您可能认为JDBC是一个丰富的API,ResultSet有这么多方法,那么为什么不只是一个getCount()方法呢?嗯,对于许多数据库,例如Oracle、MySQL和SQL Server,ResultSet是一个流式API,这意味着它不会从数据库服务器加载(甚至可能获取)所有行。在某些情况下,通过迭代到结果集的末尾,您可能会大大增加执行所需的时间

顺便说一句,如果你必须这样做,有几种方法可以做到,例如使用ResultSet.last()和ResultSet.getRow()方法,这不是最好的方法,但如果你绝对需要的话,它是有效的


不过,在Java中,从ResultSet获取列计数很容易。JDBC API提供了一个ResultSetMetaData类,其中包含返回查询返回的列数和ResultSet保留的列数的方法。

在我的例子中,我需要从ResultSet获取总行数并访问ResultSet值​​如果总行数未达到XLS文件的限制

为此,我必须对代码进行两项调整:

1) 对象构造PreparedStatement中的更改

默认的ResultSet对象有一个只向前移动的光标。因此,您只能遍历它一次,并且只能从第一行到最后一行。可以生成可滚动的ResultSet对象。下面的代码片段说明了如何创建可滚动且对其他人的更新不敏感的结果集

PreparedStatement ps = connection.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, 
ResultSet.CONCUR_READ_ONLY);
2) 获取总行数。以下代码片段说明了如何:

ResultSet rs = ps.executeQuery();
rs.last();
int totalRowsResult = rs.getRow();
rs.first();
System.out.println(rs.getString(1));
PS:如果查询结果的记录数太多,您可能会通过获取异常来耗尽Java服务器上的内存:Java.lang.OutOfMemoryError:Java堆空间。执行rs.last()方法时将发生此异常

3) 再次访问ResultSet,您不会得到消息:exhaused result set。因此,您需要使用rs.first()或rs.absolute(1)将结果集重置为顶部。以下代码片段说明了如何:

ResultSet rs = ps.executeQuery();
rs.last();
int totalRowsResult = rs.getRow();
rs.first();
System.out.println(rs.getString(1));

重复:我使用上述代码,但显示记录,但它失去了第一个记录行索引从1开始resultSet@FranciscI.B上面的例子中没有使用行索引,所以行索引是从1开始还是从其他任何地方开始都无关紧要。可能@KaranRajput正在使用它。我不知道如何才能丢失第一条记录,所以这是一个提示,以防他使用原始索引。你能详细解释一下这可能有什么帮助吗?@kommradHomer第一行代码说,我们可以在结果集中的任何地方移动(到第一行或最后一行或在第一行之前,无需从第一行开始逐行遍历,这需要时间)。第二行代码获取与我假设的查询匹配的记录(25条记录),第三行代码将光标移动到最后一行,最后一行代码获取当前行号,在本例中为25。如果没有记录,rs.last将返回0,getrow将光标移动到第一行之前,因此返回负值表示数据库中没有记录。resultSet.last();行返回布尔值,请放入if语句。很好且简单的解决方案!!注意:如果是o