获取ResultSet在Java中返回的行数

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

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

有没有任何方法来检查ResultSet返回的行数? 还是我必须写我自己的?

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

 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"); } 

首先,您应该创build可以通过命令移动光标的Statement

 Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 

然后如下检索ResultSet

 ResultSet rs = stmt.executeQuery(...); 

将光标移到最后一行并获取它:

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

那么rowsvariables将包含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; } 

只是要知道,这个方法将需要一个滚动敏感的结果集,所以当创build连接,你必须指定滚动选项。 默认是FORWARD,使用这个方法会抛出exception。

另一种区分ResultSet中的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.next()方法将把指针指向下一行。 在你的代码中你使用了两次,第一次是if条件(光标移动到第一行),然后while条件(光标移动到第二行)。

所以当你访问你的结果时,它从第二行开始。 所以在结果中显示一行。

你可以试试这个:

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

您可以用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进行计数。

这是我的解决scheme

  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(); } 

您可以将ResultSet加载到TableModel中,然后创build一个使用该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; 
 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()); 

第一行代码表示我们可以在结果集中的任何地方移动(无论是第一行还是最后一行还是第一行之前,而不需要从第一行开始逐行遍历)。第二行代码获取logging匹配查询在这里,我假设(25logging),第三行代码将光标移动到最后一行,最后一行代码获取当前行号,在我的情况是25。 如果没有logging,rs.last返回0,getrow将光标移动到第一行之前,因此返回负值表示db中没有logging

  rs.last(); int rows = rs.getRow(); rs.beforeFirst(); 

你可以使用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. } }