복붙노트

[SQL] 어떻게 java.sql.ResultSet의 크기를받을 수 있나요?

SQL

어떻게 java.sql.ResultSet의 크기를받을 수 있나요?

이것은 매우 간단 작업을해야하지? 그러나, 나는 크기 () 나 길이 () 메소드도있다 참조하십시오.

해결법

  1. ==============================

    1.대신 FROM ... 쿼리는 SELECT COUNT (*)를 수행.

    대신 FROM ... 쿼리는 SELECT COUNT (*)를 수행.

    또는

    int size =0;
    if (rs != null) 
    {
      rs.last();    // moves cursor to the last row
      size = rs.getRow(); // get row id 
    }
    

    경우 중 하나에, 당신은 전체 데이터를 반복 할 필요가 없습니다.

  2. ==============================

    2.

    ResultSet rs = ps.executeQuery();
    int rowcount = 0;
    if (rs.last()) {
      rowcount = rs.getRow();
      rs.beforeFirst(); // not rs.first() because the rs.next() below will move on, missing the first element
    }
    while (rs.next()) {
      // do your standard per row stuff
    }
    
  3. ==============================

    3.당신이 유형 ResultSet.TYPE_FORWARD_ONLY의 결과 집합이있는 경우 글쎄, 당신이 그런 식으로 유지하려는 (.last 사용할 수 있도록 위해 ResultSet.TYPE_SCROLL_INSENSITIVE 또는 ResultSet.TYPE_SCROLL_INSENSITIVE에 스위치가 아닌을 ()).

    당신이 유형 ResultSet.TYPE_FORWARD_ONLY의 결과 집합이있는 경우 글쎄, 당신이 그런 식으로 유지하려는 (.last 사용할 수 있도록 위해 ResultSet.TYPE_SCROLL_INSENSITIVE 또는 ResultSet.TYPE_SCROLL_INSENSITIVE에 스위치가 아닌을 ()).

    난 당신이 행의 수를 포함 상단에 첫번째 가짜 / 가짜 행을 추가하는 아주 좋은 효율적인 해킹을 제안한다.

    하자가 쿼리는 다음과 같다라고

    select MYBOOL,MYINT,MYCHAR,MYSMALLINT,MYVARCHAR
    from MYTABLE
    where ...blahblah...
    

    당신의 출력은 같다

    true    65537 "Hey" -32768 "The quick brown fox"
    false  123456 "Sup"    300 "The lazy dog"
    false -123123 "Yo"       0 "Go ahead and jump"
    false       3 "EVH"    456 "Might as well jump"
    ...
    [1000 total rows]
    

    간단하게 이런 식으로 뭔가에 코드를 리팩토링 :

    Statement s=myConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY,
                                             ResultSet.CONCUR_READ_ONLY);
    String from_where="FROM myTable WHERE ...blahblah... ";
    //h4x
    ResultSet rs=s.executeQuery("select count(*)as RECORDCOUNT,"
                               +       "cast(null as boolean)as MYBOOL,"
                               +       "cast(null as int)as MYINT,"
                               +       "cast(null as char(1))as MYCHAR,"
                               +       "cast(null as smallint)as MYSMALLINT,"
                               +       "cast(null as varchar(1))as MYVARCHAR "
                               +from_where
                               +"UNION ALL "//the "ALL" part prevents internal re-sorting to prevent duplicates (and we do not want that)
                               +"select cast(null as int)as RECORDCOUNT,"
                               +       "MYBOOL,MYINT,MYCHAR,MYSMALLINT,MYVARCHAR "
                               +from_where);
    

    조회 출력은 지금과 같이 될 것입니다

    1000 null     null null    null null
    null true    65537 "Hey" -32768 "The quick brown fox"
    null false  123456 "Sup"    300 "The lazy dog"
    null false -123123 "Yo"       0 "Go ahead and jump"
    null false       3 "EVH"    456 "Might as well jump"
    ...
    [1001 total rows]
    

    당신은 단지에있다 그래서

    if(rs.next())
        System.out.println("Recordcount: "+rs.getInt("RECORDCOUNT"));//hack: first record contains the record count
    while(rs.next())
        //do your stuff
    
  4. ==============================

    4.

    int i = 0;
    while(rs.next()) {
        i++;
    }
    
  5. ==============================

    5.rs.last를 사용할 때 예외를 얻었다 ()

    rs.last를 사용할 때 예외를 얻었다 ()

    if(rs.last()){
        rowCount = rs.getRow(); 
        rs.beforeFirst();
    }
    

    :

    java.sql.SQLException: Invalid operation for forward only resultset
    

    그것은 당신이 단지 rs.next를 사용할 수 있다는 것을 의미 ResultSet.TYPE_FORWARD_ONLY, ()는 기본적으로 때문입니다

    해결책은 다음과 같습니다

    stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
        ResultSet.CONCUR_READ_ONLY); 
    
  6. ==============================

    6.[스피드 고려]

    [스피드 고려]

    PPL의 부지는 여기 ResultSet.last ()를 제안하지만 당신은 더비 임베디드 데이터베이스의 10 배에 ResultSet.TYPE_FORWARD_ONLY보다 느린까지입니다 ResultSet.TYPE_SCROLL_INSENSITIVE로 열린 연결해야합니다.

    임베디드 Derby와 H2 데이터베이스에 대한 내 마이크로 테스트에 따르면, 그것은 당신의 선택하기 전에 SELECT COUNT (*)를 호출하는 속도가 매우 빠르고입니다.

    여기에 더 자세히 내 코드와 내 벤치 마크

  7. ==============================

    7.이 행 카운트를 할 수있는 간단한 방법입니다.

    이 행 카운트를 할 수있는 간단한 방법입니다.

    ResultSet rs = job.getSearchedResult(stmt);
    int rsCount = 0;
    
    //but notice that you'll only get correct ResultSet size after end of the while loop
    while(rs.next())
    {
        //do your other per row stuff 
        rsCount = rsCount + 1;
    }//end while
    
  8. ==============================

    8.ResultSet의, ArrayList에 등을 사용할 필요가 없습니다의 점점 크기의 방법

    ResultSet의, ArrayList에 등을 사용할 필요가 없습니다의 점점 크기의 방법

    int size =0;  
    if (rs != null)   
    {  
    rs.beforeFirst();  
     rs.last();  
    size = rs.getRow();
    }
    

    이제 당신은 크기를 얻을, 그리고 것입니다 당신이 너무 코드 행 다음에 인쇄를 사용하기 전에 결과 집합을 인쇄하려면,

    rs.beforeFirst();  
    
  9. ==============================

    9.

    String sql = "select count(*) from message";
    ps =  cn.prepareStatement(sql);
    
    rs = ps.executeQuery();
    int rowCount = 0;
    while(rs.next()) {
        rowCount = Integer.parseInt(rs.getString("count(*)"));
        System.out.println(Integer.parseInt(rs.getString("count(*)")));
    }
    System.out.println("Count : " + rowCount);
    
  10. ==============================

    10.나는 ResultSet 인터페이스의 런타임 값을 확인하고는 거의 모든 시간 ResultSetImpl했다 발견. ResultSetImpl 당신이 찾고있는 값을 반환 (getUpdateCount 메소드라는 방법)이있다.

    나는 ResultSet 인터페이스의 런타임 값을 확인하고는 거의 모든 시간 ResultSetImpl했다 발견. ResultSetImpl 당신이 찾고있는 값을 반환 (getUpdateCount 메소드라는 방법)이있다.

    이 코드 예제는 충분합니다 : 으로 결과 집합의 ResultSet하는 executeQuery = (은 SQLQuery); 배를 rowCount = ((ResultSetImpl)으로 결과 집합) .getUpdateCount ()

    그 downcasting는 일반적으로 안전하지 않은 절차 실현하지만이 방법은 아직 저를 실패하지 않았다.

  11. ==============================

    11.오늘은 내가 RS의 수를 점점 알 수없는 이유는이 논리를 사용했다.

    오늘은 내가 RS의 수를 점점 알 수없는 이유는이 논리를 사용했다.

    int chkSize = 0;
    if (rs.next()) {
        do {  ..... blah blah
            enter code here for each rs.
            chkSize++;
        } while (rs.next());
    } else {
        enter code here for rs size = 0 
    }
    // good luck to u.
    
  12. ==============================

    12.

    theStatement=theConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
    
    ResultSet theResult=theStatement.executeQuery(query); 
    
    //Get the size of the data returned
    theResult.last();     
    int size = theResult.getRow() * theResult.getMetaData().getColumnCount();       
    theResult.beforeFirst();
    
  13. ==============================

    13.저도 같은 문제가되었다. 실행이 그것을 해결 직후에 이런 식으로 ResultSet.first ()를 사용 :

    저도 같은 문제가되었다. 실행이 그것을 해결 직후에 이런 식으로 ResultSet.first ()를 사용 :

    if(rs.first()){
        // Do your job
    } else {
        // No rows take some actions
    }
    

    문서 (링크) :

  14. ==============================

    14.가장 쉬운 방법, 실행 횟수 (*) 쿼리, 첫 번째 행에 지점 resultSet.next ()를 수행 한 후 바로 수를 얻기 위해 (1) resultSet.getString 않습니다. 코드 :

    가장 쉬운 방법, 실행 횟수 (*) 쿼리, 첫 번째 행에 지점 resultSet.next ()를 수행 한 후 바로 수를 얻기 위해 (1) resultSet.getString 않습니다. 코드 :

    ResultSet rs = statement.executeQuery("Select Count(*) from your_db");
    if(rs.next()) {
       int count = rs.getString(1).toInt()
    }
    
  15. ==============================

    15.열 이름을 지정 ..

    열 이름을 지정 ..

    String query = "SELECT COUNT(*) as count FROM
    

    참조를 int로 ResultSet 객체에서 열하고 거기에서 논리를 수행하는 것이 ..

    PreparedStatement statement = connection.prepareStatement(query);
    statement.setString(1, item.getProductId());
    ResultSet resultSet = statement.executeQuery();
    while (resultSet.next()) {
        int count = resultSet.getInt("count");
        if (count >= 1) {
            System.out.println("Product ID already exists.");
        } else {
            System.out.println("New Product ID.");
        }
    }
    
  16. from https://stackoverflow.com/questions/192078/how-do-i-get-the-size-of-a-java-sql-resultset by cc-by-sa and MIT license