다가오는 다음을 향해

[JSP Java] 에러 - java.sql.SQLException: Operation not allowed for a result set of type ResultSet.TYPE_FORWARD_ONLY. 본문

국비학원 공부노트/JSP

[JSP Java] 에러 - java.sql.SQLException: Operation not allowed for a result set of type ResultSet.TYPE_FORWARD_ONLY.

hyeseo 2022. 2. 23. 10:54

[ 개발환경 ]

MacBook Air M1 2020년형 

eclipse [2021-3 var]

Java [zulu-8]

JSP

Tomcat [Apache Tomcat/9.0.58]

 

MacBook Air M1 // Java JSP로 게시판 구현 중 해결한 걸 정리하는 목적으로 작성하는 글입니다..


 

 

오류: java.sql.SQLException: Operation not allowed for a result set of type ResultSet.TYPE_FORWARD_ONLY.

 

▼ 수정 전 코드

conn = DBConnection.getConnection();
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();

while (rs.absolute(index)) {
    BoardDTO board = new BoardDTO();
    board.setNum(rs.getInt("num"));
    board.setId(rs.getString("id"));
    board.setName(rs.getString("name"));
    board.setSubject(rs.getString("subject"));
    board.setContent(rs.getString("content"));
    board.setRegist_day(rs.getString("regist_day"));
    board.setHit(rs.getInt("hit"));
    board.setIp(rs.getString("ip"));
    list.add(board);

    if (index < (start + limit) && index <= total_record)
        index++;
    else
        break;
}

 

원인 : 커서를 이동하지 않고 건너 뛰어서 발생한 것이였다.

 

pstmt = conn.prepareStatement(sql); 를

커서 위치 지정해줄 수 있게 아래 부분만 변경했다.

 

pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

 

 

[ 참고자료 ]

 

ResultSetType : 이동 관련 속성값 

속성 설명
ResultSet.TYPE_FORWARD_ONLY 커서를 다음레코드(아래 행 row)로만 이동 가능
ResultSet.TYPE_SCROLL_INSENSITIVE 커서를 원하는 행으로 이동 - 업데이트 내용 미반영
ResultSet.TYPE_SCROLL_SENSITIVE 커서를 원하는 행으로 이동 - 업데이트 내용 반영
ResultSet.TYPE_CONCUR_READ_ONLY 데이터 변경 불가능
ResultSet.TYPE_CONCUR_UPDATABLE 데이터 변경 가능

 

▼ 데이터 커서 이동 메소드

메소드 설명
beforeFirst()  resultset객체의 첫 부분으로 이동
afterLast() resultset객체의 끝부분으로 이동
first() 처음 레코드가 존재하는 행으로 이동
last()   마지막 레코드가 존재하는 행으로 이동
next() 다음 레코드 행으로 이동한다.
previous() 이전 레코드 행으로 이동한다.
absolute(int rownum)  지정한 위치로 커서 이동한다.

 

 

▼ 수정 후 코드 

conn = DBConnection.getConnection();
pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = pstmt.executeQuery();

while (rs.absolute(index)) {
    BoardDTO board = new BoardDTO();
    board.setNum(rs.getInt("num"));
    board.setId(rs.getString("id"));
    board.setName(rs.getString("name"));
    board.setSubject(rs.getString("subject"));
    board.setContent(rs.getString("content"));
    board.setRegist_day(rs.getString("regist_day"));
    board.setHit(rs.getInt("hit"));
    board.setIp(rs.getString("ip"));
    list.add(board);

    if (index < (start + limit) && index <= total_record)
        index++;
    else
        break;
}