2011-11-28 67 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();