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

 

java.sql.ResultSet 객체를 사용할 때 만날 수 있는 에러 메시지 중 하나입니다. 

 

ResultSet 객체는 기본적으로 전방향으로만 탐색이 가능합니다. 

ReultSet을 사용할 때 대부분의 경우 next() 메소드를 사용하실 텐데요, 이 next() 메소드가 전방향 메소드의 대표격입니다. 

또한 마지막 커서로 위치를 옮기는 last() 메소드도 전방향 메소드의 하나입니다.

 

그렇다면 위의 에러메시지가 나타난 이유는 무엇일까요?

에러메시지에서 말해주듯이 전방향 작업이 아닌 후방향 작업이 수행되었기 때문입니다. 

 

후방향으로 작업이 수행되는 ResultSet의 메소드는 previous(), first(), absolute()가 있습니다.

아마 이 메소드들을 쓰다가 위의 에러메시지를 받아보셨을겁니다. 

 

해결 방법은 두가지입니다. 

 

첫번째 방법은 쉽고 직관적입니다. 

전방향 전용 결과 집합에 부적합하다고 하니 후방향 작업을 수행하지 않는겁니다.

 

두번째 방법은 ResultSet객체가 전후방 양방향으로 작업을 수행할 수 있게 만들어 주는 겁니다. 

ResultSet객체는 보통 아래와 같이PreparedStatement 객체의 executeQuery()메소드를 통해 얻습니다. 

 

Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

String sql = "execute this query!";

try {
    conn = getConnection();
    pstmt = conn.prepareStatement(sql);
    pstmt.setString(1, "String");
    rs = pstmt.executeQuery();
} catch (SQLException e) {
    e.printStackTrace();
}

 

이렇게 ResultSet rs를 얻게 되면 전방향 작업만을 수행할 수 밖에 없는 상태가 됩니다. 

양방향 작업을 수행하기 위해서는 connection 개체의 prepareStatement 메소드를 통해 PreparedStatement 객체를 생성할  때 

매개값(parameter)으로 ResuletSet의 정적 필드 두 개를 넘겨주어야 합니다. 

두 정적 필드는 다음과 같습니다.

 

1) ResultSet.TYPE_SCROLL_INSENSITIVE

2) ResultSet.CONCUR_UPDATABLE

 

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

 

이렇게 PreparedStatement 객체를 생성하고 나면 양방향으로 작업을 수행할 수 있게 됩니다.