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
'DB > Oracle' 카테고리의 다른 글
[펌] 1:1 테이블의 진실, 1:1관계 테이블 분리 이유 (0) | 2017.08.24 |
---|---|
[JDBC] Resultset을 이용한 행 갯수 구하기. (0) | 2017.03.29 |
[oracle] merge into (0) | 2017.03.29 |
토트에서 함수실행 (0) | 2017.02.21 |
PK 가 없는 테이블에서 중복된 데이터 제거하기 (0) | 2016.12.22 |
댓글