DB/Oracle

Connection 에 따른 ResultSet 의 설정, resultSet row 수, 개수

벨포트조던 2017. 3. 29.
반응형

JDBC 를 이용해서 데이터를 가지고 오는 과정에서

 

특정 테이블의 내용을 출력하려고 하는데 JTable 도 힘든데..이해 못할 에러가 발생한다..

 

소스코드는 대략 아래와 같다.

 

<---- 소스코드 ---->

 

prmt = con.prepareStatement("select * from " + jtf1.getText());

rs = prmt.executeQuery();
rsmd = rs.getMetaData();

 

rs.last();     
row_count = rs.getRow();    // 레코드 수확인
rs.beforeFirst();    // 커서 원위치
col_count = rsmd.getColumnCount();    // 테이블 컬럼의 갯수


Object [][] data = new Object[row_count][col_count];   

//데이터의 갯수만큼 Object 배열을 생성한다


for(int row=0 ; rs.next(); row++){
    for(int col=0;col< rsmd.getColumnCount(); col++){
        data[row][col] = rs.getString(col+1);    // 질의결과를 Object 저장한다
    }
}

String [] col_name = new String[col_count];    // 컬럼 이름을 저장하기 위한 배열 생성


for(int col=0;c<col_count;col++){
    c_name[col] = rsmd.getColumnName(col+1);    // 컬럼의이름을 저장
}

 

DefaultTableModel model = new DefaultTableModel(data, col_name);    // 테이블모델을 생성
jtable.setModel(model);    // 테이블의 모델을 설정한다

 

 

<---- 에러 ---->

java.sql.SQLException: 전방향 전용 결과 집합에 부적합한 작업이 수행되었습니다 : last

 

rs.last();  이곳에서 에러가 발생한 것이다. 원인이 무엇인지도 모르다가 인터넷을 뒤지다가 해답을 찾았다. 첫번째 줄에 있는

 

prmt = con.prepareStatement("select * from " + jtf1.getText()); 

 

이 코드를 아래와 같이 바꿔준다.

 

prmt = con.prepareStatement("select * from "+jtf1.getText(),

                                      ResultSet.TYPE_SCROLL_SENSITIVE,

                                      ResultSet.CONCUR_UPDATABLE);

 

rs.last()는 데이터를 가리키는 커서를 가장 마지막 row 로 이동하는 것이다. 알고보니

Connection con 의 con.prepareStatement(sql, resultSetType, resultSetConcurrency) 의 형태가 존재한다.

 

- sql 은 말그대로 질의하기 위한 SQL 문을 말한다.

 

- resultSetType 에는 아래와 같은 3가지가 있다.

    * TYPE_FORWARD_ONLY : 커서의 이동이 한방향으로만 가능하다.

    * TYPE_SCROLL_SENSIVE : 커서의 이동이 자유롭고 업데이트 내용을 반영한다.

    * TYPE_SCROLL_INSENSITIVE : 커서의 이동이 자유롭고 업데이트 내용을 반영하지 않는다.

 

SENSITIVE 와 INSENSITIVE의 차이는 다른 곳에 의해 DB의 내용이 변경되면 그 내용을 반영하는지 안하는지의 차이이다. 물론 SENSITIVE 가 변경 내용을 반영하는 것이다.

 

- resultSetConcurrency 에는 두가지가 있다.

    * CONCUR_UPDATABLE : ResultSet 에 저장되어있는 데이터를 변경할 수 있다.

    * CONCUR_READ_ONLY : ResultSet 에 저장되어있는 데이터를 변경할 수 없다. (읽기모드) 


그렇기 때문에 SQL 쿼리를 날려서 가지고 온 데이터를 변경하거나 커서를 이동하기 위해서는 위와 같은 내용을 참고하기 바란다.

 

 

 

==> 추가로 ResultSet 에는 커서를 움직일 수 있는 몇가지 메소드가 존재한다.

    last() : 레코드의 맨 마지막 row로 이동한다.

    first() : 레코드의 첫번째 row 로 이동한다.

    next() : 다음 레코드로 이동한다. (다음 row로 이동)

    previous() : 이전 레코드로 이동한다. (이전 row 로 이동)

    beforeFirst() : 커서를  처음위치로 이동한다.

    afterLast() : 커서를 마지막 위치로 이동한다.

    absolute(int row) : 커서를 특정 row 위치로 이동한다.



출 : http://blog.naver.com/PostView.nhn?blogId=kjhfreedom21&logNo=110083103914&beginTime=0&jumpingVid=&from=search&redirect=Log&widgetTypeCall=true

반응형

댓글