SQLFetch 관련 버그에 대해..
DB 라이브러리를 짜고 있습니다.
로직적으로는 문제가 없습니다.. PreparedStatement 이용해서 Column 바인딩 한 후에 SQLExecute로 실행하고 ResultSet을 가져오기 위해 SQLFetch를 하는 형식입니다.
원래 그다지 많은 쿼리가 들어갈 예정이 아니라 PreparedStatement를 초기화 할때 텍스트파일에 select * from tbl; 과 같은 형식으로 쿼리를 직접 적어둔걸 읽어서 실행하는 방식이었습니다.
그런데 이제 쿼리가 점점 늘어가고 퍼포먼스도 중요해질거 같아 쿼리를 전부 StoredProcedure로 빼고 텍스트 파일을 EXEC SELECT_QUERY_1; 과 같은 형식으로 바꿨습니다
로직상 동일한 처리가 들어갑니다. SP의 경우 select 같은 result set이 필요하다면 OUTPUT Parameter를 이용해서 실제 쿼리를 날리는 것과 동일하다는 것도 알고있습니다.
그런데 이렇게 하면 SQLExecute, 즉 실행까지는 잘 되다가 SQLFetch에서 액세스 위반으로 뻗어버립니다.
몇몇 문서를 찾아보니, ODBC 자체의 버그로 인해 64비트 OS에서는 SQLFetch 시에 ResultSet의 ValueType을 SQL_C_CHAR 등으로 맞춰 주어도 실제 들어갈 때는 ANSI 타입으로 들어가서 그렇다는 글을 보아서, ODBC 자체의 버그겠거니 했습니다.
그래서 실제 SQLFetch 전후의 값을 뜯어보려고 로그 남기는 코드를 추가했더니, 이제는 Fetch에서 뻗지도 않고 잘 돌아갑니다.....심지어 값도 제대로 읽어오구요.
로그의 유무가 버그를 고치는 해괴한 현상이 벌어진 것입니다.
대체 어디서부터 의심을 해야할 지도 모르겠고, 이렇게 로그를 남겨서 잡은 코드를 믿고 안심한 채 쓸수 있을지도 의문입니다.
질문은 두 가지입니다..
1. SQLFetch (Windows Server 2008 R2)와 관련된 액세스 위반 버그가 있나요? 혹은 겪어보신 분은 어떻게 해결하셨나요?
2. 로그 (제 코드에선 wprintf_s 로 ResultSet을 출력합니다)를 남기고 안남기고에 따라 달라지는 게 무엇이길래 버그가 사라졌다 나타났다 하는걸까요?
댓글 달기