Jan 10 2008

Java SE 6.0 + jTDS 1.2 + MS-SQL(SQLServer) 2000 + BLOB(image) 예외 발생하면 확인해봐야 할 것

분류: Open.Library 태그: ,, , , , Heart @ 10:05 오후

Trackback : http://dev.heartsavior.net/archives/61/trackback/

Java SE 6.0 + jTDS 1.2 + MS-SQL(SQLServer) 2000 + BLOB(image) + File 객체 사용 시에 주의해야 할 점이다.

아래는 파일 내용을 그대로 MS-SQL DB에 기록하는 코드… 뭐, 이정도면 되겠지?

첫 시도

FileInputStream fis = null;
File f = new File(path);
fis = new FileInputStream(f);

pstmt = prConn.prepareStatement(query);
pstmt.setBinaryStream(1, fis);          // Error!!!

int nCount = pstmt.executeUpdate();

Exception in thread “main” java.lang.AbstractMethodError:
net.sourceforge.jtds.jdbc.JtdsPreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V

엇? AbstractMethodError 예외가 발생… 음… 길이를 지정해볼까?

두번째 시도

pstmt.setBinaryStream(1, fis, f.length());          // Error!!!

마찬가지로 같은 예외가 발생…

구글링으로도 관련 자료를 못 찾았는데, 지푸라기라도 잡는 심정으로 jTDS 포럼을 들어가서 수 차례 검색해 본 결과 관련 자료를 찾을 수 있었다.

@ RE: pst.setBinaryStream error By: Mike Hutchinson

내용을 요약하자면, setBinaryStream()의 3번째 인자가 long인 것은 JDBC 4 이고, J2SE 6.0은 JDBC 4를 지원하는데 jTDS의 현재 버전은 JDBC 3을 구현했다는 것이다.
즉, 위의 예외는 구현되지 않은 메소드가 호출되었을 때 발생하는 것이고, JDBC 3 에서 지원하는 setBinaryStream() 은 3번째 인자가 int 이다.

그래서 수정한 버전…

pstmt.setBinaryStream(1, fis, (int)f.length());      // OK!!!

아주 잘 입력된다.

jTDS 가 구현한 JDBC 버전과, JDBC 버전간의 차이를 알아야 문제의 원인 및 해결 방안을 찾을 수 있는 문제인데, 덕분에 쉽게 헤쳐나가서 다행이다. Know-Where의 중요성을 다시 한 번 실감한 날이랄까?