ODBC 프로그래밍을 하다보면, BLOB 타입 데이터를 처리할 때 자주 만나게 되는 에러이다.
예전에는 MS버그 려니, 하고 다음과 같은 방법으로 처리했었다.

1. 테이블을 설계할 때 BLOB 타입은 항상 마지막으로 몬다.
   BLOB 타입이 여러개라면 모두 뒤쪽으로 몰아서 사용한다.

2. ODBC는 때려치고, ADO나 OLEDB를 사용한다.
    (나는 ODBC를 꼭 써야하는 이유가 있으니 이 방법은 XXX 이다. -_-)
    (사실 ADO는 쬐끔 써봤는데... OLEDB는 써본적이 한번도 없다..헐~)

위 두가지 방법이 인터넷 뒤져서 나온 해결법의 전부였다. MS포럼이나 KB 및 구글 뒤져바야
나오는게 그게 그거이다. MS에 문의해보니 안갈켜준다 -_-;;;

저 에러가 나오는 원인은 데이터 전송시 전송 효율을 올리기 위해서 미리 메모리를 할당해서 각
컬럼별로 바인딩 해놓고 패치하게 되는데, 크기 범위가 정해지지 않은 BLOB 데이터를 중간에
끼워넣게 되면 미리 준비된 메모리에 패치할 수 없기 때문이다.
(모든 프로토콜 분야에서 전송 성능은 상당히 중요한 이슈이다.)

이럴 경우 BLOB 영역은 0으로 리절브를 하게되고, 별도로 SQLGetData 를 이용해서 데이터를
가져오게 되는데....
이게 위치가 끝부분이 아니고, 중간부분에 가게되면 데이터 패치는 성공하지만, BLOB 데이터를
가져오려 하면  제목에 보이는 잘못된 인덱스 입니다 라는 에러가 발생한다.

한참 고민(3년간 사용하는 동안 -_-)하다가 문제의 원인을 추적해 보니, 패치하기 위하여 미리
메모리를 바인딩 해놓는 부분을 생략하고, 그 때 그 때 데이터를 SQLGetData 로 가져오는
방법
을 생각해 봤다.

흠.. 잘나온다 -_-;;;

단, 미리 예비된 메모리에 덩어리로 패치하는게 아니기 때문에, 데이터 로우수가 많을 경우
위 방법을 사용하면 성능 저하가 발생할 수 있으므로, 사용상에 주의를 할 필요가 있다.

그나마 성능을 보전하기 위하여 머리를 굴려본걸 정리해 보면 다음과 같다.

1. 컬럼 정보를 읽어올 때 BLOB가 있는지 검사한다.
2. 모든 BLOB 컬럼이 뒤쪽에 몰려 있으면, 바인딩해서 리절브된 메모리에 패치하고, 나머지는 SQLGetData 로 긁어온다.
3. 중간에 BLOB 컬럼이 끼어있으면, 바인딩을 안하고 모든 컬럼을 SQLGetData 로 긁어온다.

이렇게 직접 구현하는 사람들이 많지 않겠지만, 그래도 혹시나 아직까지 쓰는 사람들이 있다면
조금이라도 도움이 되겠죠 ^^;;;

+ Recent posts