강의 컨설팅 트레이닝 무료진단 무료책자 마케팅편지 마케팅정보공유 다이어리 서비스제휴 고객센터

MS-SQL JDBC "ResultSet Can Not Re-Read Row Data" 예외 처리 방법
작성자 : 13 김영철
등록날짜 : 2009.01.24 23:13
3,281
MS-SQL 2000 서버를 JDBC를 이용해서 사용하다 보면 "ResultSet Can Not Re-Read Row Data"' Error When Reading Data from a JDBC ResultSet Object"라는 에러가 발생하는 경우가 있다. 일반적인 VARCHAR 필드나 NUMBER 타입의 필드를 사용할 때는 발생하지 않는다. 그러나 TEXT, NTEXT, IMAGE 타입 필드(BLOB 타입)를 사용할 경우에는 위와 같은 예외 메시지가 나타나는 경우가 있다.
그러한 예외가 발생하는 이유는 BLOB 데이터를 읽어 올 때는 Cache 문제 때문에 무조건 순서대로 읽어 와야 하는데 있다. 자세한 이유는 여기에서 확인할 수 있다.
이를 해결하는 방법은 간단하다. 무조건 앞의 것 부터 읽어 오도록 설정을 해주면 된다. 즉 다음과 같은 방식으로 처리 해주면된다.

rs.getString(1);
rs.getString(2);

그렇지만 이를 어기고

rs.getString(2);
rs.getString(1);

과 같이 데이터를 가져오려고 하면 위와 같은 에러가 발생한다. 경우에 따라서 (내 경우가 이에 속한다) 결과 Set을 처리하기 위한 Utility 클래스를 만들어서 사용하는 경우가 있다. 예를 들어 결과 데이터를 가져와서 HashMap이나 Hashtable을 이용하는 경우이다. 내 경우에는 아래와 같은 메소드를 만들어 사용하고 있다.

public HashMap getGeneralEntity()
throws SQLException
{
if (m_rs == null || m_rsmd == null)
return null;

HashMap result = new HashMap();
String strColumnName = null;
BigDecimal numberValue = null;
String stringValue = null;
Boolean booleanValue = null;
Timestamp dateValue = null;

// 2004-10-22 : 기존에 데이터를 역순으로 읽도록 되어 있는 것을 수정하여 처음 것 부터 순서대로 읽어 오도록 한다.
// 기존에 역순으로 되어 있는 것은 Hashmap을 사용하므로 동일 이름의 컬럼이 존재하는 경우 첫번째 것 부터 읽혀지므로
// 결과 적으로 나중의 것이 읽혀 지게 된다. 그래서 첫번째 데이터에 우선 순위를 주기 위해서 사용한다.
// for (int i=(m_rsmd.getColumnCount()); i > 0; i--)
for (int i=1; i <= m_rsmd.getColumnCount(); i++)
{
strColumnName = m_rsmd.getColumnName(i).trim().toUpperCase();

// 컬럼의 이름은 TRIM 해준다.
if (strColumnName != null)
strColumnName = strColumnName.trim();
else
continue;

// 동일 이름의 데이터가 이미 저장되어 있는지 검사하여 존재하는 경우에는 SKIP 해준다.
if (result.containsKey(strColumnName))
continue;

switch (checkType(m_rsmd.getColumnType(i)))
{
case TYPE_STRING :
if (m_rsmd.getColumnType(i) != Types.CLOB)
stringValue = m_rs.getString(i);
else
stringValue = SQLUtil.getClobData(m_rs.getClob(i));
result.put(strColumnName, stringValue);
break;

case TYPE_NUMBER :
numberValue = m_rs.getBigDecimal(i);
result.put(strColumnName, numberValue);
break;

case TYPE_DATE :
dateValue = m_rs.getTimestamp(i);
result.put(strColumnName, dateValue);
break;

case TYPE_BOOLEAN :
booleanValue = new Boolean(m_rs.getBoolean(i));
result.put(strColumnName, booleanValue);
break;

default :
result.put(strColumnName, null);
}
}
return result;
}

위의 소스는 사용하고 있는 클래스의 일부분이다. 간단히 설명하면 ResultSetMetaData로 부터 컬럼 정보를 받은 다음에 컬럼 정보를 가지고 데이터를 적절한 형태로 빼오는 기능이다. (내부적으로 사용하고 있는 checkType(int) 등은 별도로 만든 메소드이다.)
이와 같은 식으로 구현을 하면 위의 예외를 피해 갈 수 있다. 

[출처]  민주가인

"쇼핑몰·홈페이지·오픈마켓
블로그·페이스북·이메일 등의 각종 마케팅 글쓰기,
각종 광고, 영업, 판매, 제안서, 전단지
반응율 3배×10배 이상 높이는 마법의 8단계 공식"
자세히보기

Comments

번호 제목 글쓴이 날짜 조회
3015 AJAX으로 놀자~ (채팅) 13 김영철 01.29 3319
3014 PHP에서 멀티 쓰레드 흉내내기 99 단국강토 01.08 3316
3013 DLL화일 레지스트리에 등록 또는 삭제 하기 M 최고의하루 12.24 3314
3012 $PHP_SELF .... $REQUEST_URI 13 김영철 01.13 3312
3011 Ajax [www.atmarkit.co.jp] 13 김영철 01.29 3310
3010 알씨로 초간단 동영상 슬라이드쇼 만들기 99 단국강토 01.07 3310
3009 html] textbox에서 readonly, disabled 99 단국강토 01.19 3308
3008 [CSS]글씨 크기-줄 간격 조절해서 보기 좋은 문서 만들기 99 단국강토 02.09 3307
3007 부팅 안되는 XP 복구 : fixmbr 13 김영철 01.29 3306
3006 오늘 하루 창 열지 않기 M 최고의하루 12.24 3305
3005 심플한 모바일 디자인 그림. M 최고의하루 12.04 3298
3004 DOS창에서 메인보드 확인하기 2 천진난만 02.20 3292
3003 DBMS에 따른 날짜포맷 변환 99 단국강토 01.07 3290
3002 html코드표 2 아론k 06.24 3287
열람중 MS-SQL JDBC "ResultSet Can Not Re-Read Row Data" 예외 처리 방법 13 김영철 01.24 3282
3000 동적 쿼리의 해결사 sp_executesql vs. exec 99 단국강토 01.02 3280
2999 리눅스 명령어 디비복구 제로보드 복구 M 최고의하루 12.24 3280
2998 [매뉴얼 정리] 오라클 백업 M 최고의하루 01.12 3279
2997 3D 문자 만들기 | 포 토 샵 [고급] 10 액션쟁이 01.05 3274
2996 실행 시간 제한 없애기 13 김영철 01.14 3273
2995 개인정보 메모장 댓글2 2 가이버김 09.14 3266
2994 Mysql 함수 총집합 13 김영철 01.29 3265
2993 EXCEL 파일 READER 에 한글 변환기능 추가 13 김영철 01.14 3262
2992 HTML 특수문자코드표 99 단국강토 02.19 3259
2991 띠 구하는 함수 13 김영철 01.14 3257
2990 자동으로 드라이버를 알려주는 프로그램 17 vane 12.27 3257
2989 Hair[포토샵강좌][포토샵디자인/편집광고디자인/컬러리스트] 10 액션쟁이 01.02 3256
2988 SQL : INSERT : 데이터베이스 생성과 테이블 생성 13 김영철 01.23 3256
2987 [ MySQL ] MySql4.x / PHP4.x / Apache 한글깨짐 M 최고의하루 12.18 3255
2986 정규식으로 환율 구하기 13 김영철 01.15 3253
마케팅
특별 마케팅자료
다운로드 마케팅자료
창업,경영
기획,카피,상품전략
동기부여,성취