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

MS-SQL JDBC "ResultSet Can Not Re-Read Row Data" 예외 처리 방법
작성자 : 13 김영철
등록날짜 : 2009.01.24 23:13
3,283
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

번호 제목 글쓴이 날짜 조회
2715 MySQL 에서 사용되는 sql문 정리 M 최고의하루 12.19 2743
2714 [ MySQL ] MySQL 기본적으로 익혀야할 과제 M 최고의하루 12.18 2501
2713 [ MySQL ] MySql4.x / PHP4.x / Apache 한글깨짐 M 최고의하루 12.18 3257
2712 [ MySQL ] MySQL 5 한글 UTF8 한글 깨짐 분석 (Windows 용) M 최고의하루 12.04 5731
2711 MySQL 명령어 정리 M 최고의하루 12.04 2388
2710 MSSQL 페이징 13 김영철 01.24 2487
2709 mssql 암호화 13 김영철 01.24 2487
2708 mysql과 mssql의 변환시 유의사항 13 김영철 01.24 2673
2707 mssql 백업방법 13 김영철 01.24 2773
2706 데이터 정보 확인방법 13 김영철 01.24 2355
열람중 MS-SQL JDBC "ResultSet Can Not Re-Read Row Data" 예외 처리 방법 13 김영철 01.24 3284
2704 IDENTITY 속성 13 김영철 01.24 2160
2703 Jsp + Mssql Long타입 데이타 사용시 문제점 13 김영철 01.24 2764
2702 PWDENCRYPT와 PWDCOMPARE를 통해 암호화 기능 13 김영철 01.24 3471
2701 MSSQL 기본값 13 김영철 01.24 3037
2700 :: 데이터베이스의 종류 :: 13 김영철 01.24 2350
2699 :: 데이터베이스의 객체 :: 13 김영철 01.24 2635
2698 :: Transact-SQL 이란 :: 13 김영철 01.24 2886
2697 :: 단순 SELECT 문 :: 13 김영철 01.24 2368
2696 :: WHERE 절 :: 13 김영철 01.24 2803
2695 :: ORDER BY, GROUP BY :: 13 김영철 01.24 2479
2694 :: 조인(Join) 이란? :: 13 김영철 01.24 2182
2693 :: 조인(Join)의 사용 예 :: 13 김영철 01.24 2343
2692 :: SELECT INTO 와 INSERT INTO :: 13 김영철 01.24 2576
2691 :: 데이터베이스의 구조 :: 13 김영철 01.24 2307
2690 :: 데이터베이스 생성 :: 13 김영철 01.24 2112
2689 :: 데이터 무결성 :: [출처] :: 데이터 무결성 :: (쇼핑몰 대박못내는 진짜이유!) |작성자 프런티어 13 김영철 01.24 3177
2688 :: 인덱스(Index) :: 13 김영철 01.24 2091
2687 :: 뷰(View) :: 13 김영철 01.24 2817
2686 :: 저장프로시저 (Stored Procedure) :: 13 김영철 01.24 2784
마케팅
특별 마케팅자료
다운로드 마케팅자료
창업,경영
기획,카피,상품전략
동기부여,성취