2011-11-28 165 views
48

我已经使用了返回特定行数的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返回的行数的任何方法?或者我必须写我自己的?

+0

重复的:HTTP:/ /stackoverflow.com/questions/7545820/total-number-of-row-resultset-getrow-method –

回答

47

你可以使用一个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"); 
} 
+0

我使用上面的代码,但和显示记录,但它失去了ResultSet中的第一条记录 –

+0

行索引从1开始 –

+0

@ FranciscI.B在上面的例子中没有使用行索引,因此如果行索引从1开始或其他任何内容都没有关系。 – Jesper

4

res.next()方法将把指针指向下一行。并在你的代码中使用它两次,第一次为if条件(光标移动到第一行),然后while条件(光标移动到第二行)。

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

你可以试试这个:

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

首先,你应该创建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(); 
    ... 
} 

然后变量将包含SQL

22

返回的行数的简单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; 
} 

只是要注意,这种方法需要一个在创建连接时滚动敏感结果集,您必须指定滚动选项。默认是FORWARD,使用这个方法会抛出异常。

+0

resultSet.last();行返回布尔值,请将if语句放入。 –

7

另一种方式从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. 
    } 
} 

如果你必须知道给出一个结果的行数,这里是一个方法来获得它:

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

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

您可以将结果集加载到一个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; 
2

你可以使用SQL计数和从ResultSet检索答案,像这样:

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来算基于一个标准。

0
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移动光标到前第一行因此返回负值表示分贝

+0

你能否详细说明这可能会有帮助吗?代码 – kommradHomer

+0

@kommradHomer第一行说,我们可以在结果集中移动任何地方(无论是第一排还是最后一行或第一行之前,无需按行遍历行从第一行是一次服用开始)。第二行代码这里获取匹配查询记录我假设(25条记录),代码第三行将光标移动到最后一排和代码最后一行获取当前行号这是在我的案件25。如果没有记录,rs.last返回0和GETROW移动光标以便因此第一行返回负值之前表示分贝任何记录。 –

1

此我的解决办法中没有记录

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(); 
     } 
0
 rs.last(); 
     int rows = rs.getRow(); 
     rs.beforeFirst();