오묘한 SQL_SUCCESS_WITH_INFO
* 공부중이라 틀린 부분도 있습니다; 지적해주세요;
ODBC에서 성공 여부를 판단하는 방법은 대충 이렇다:
bool IsSuccess(SQLRETURN sRetCode) {
return (sRetCode == SQL_SUCCESS || sRetCode == SQL_SUCCESS_WITH_INFO);
}
SQL_SUCCESS는 군말없이 성공했단 얘기이고, SQL_SUCCESS_WITH_INFO는 성공했으며 사용자가 확인할 수 있는 추가적인 정보가 더 있다는 얘기다. 이 추가적인 정보는 SQLSTATE라는걸로 설정되므로 ...()를 이용해 확인할 수 있다.
말하자면, 경고나.. 뭐 그런게 있단 소리인데... 사실 그 경고가 무시할만한 수준이 아니라서 상수 이름 SQL_SUCCESS_WITH_INFO만 보고, 성공한것으로 생각했다간 큰일 날 경우도 생긴다.
예를 들어 SQLGetDate()의 경우, 버퍼가 작으면 SQL_SUCCESS_WITH_INFO를 반환한다. 얻어오려는 값이 문자열이었다면 이 동작이 '최선의 방법'이다고 할 수도 있겠지만, 만약 얻으려는 값이 구조체였다면 그것은 단지 경고 수준의 문제가 아닐 것이다. 왜냐하면 얻어온 값은 전혀 유효하지 않기 때문이다. 주1
사실 문제는 SQLRETURN으로 사용되는 값이 5개 정도로 너무 적은데 있는게 아닌가 싶다. 때문에 의미적으로는 실패를 했을 때에도 반환값은 성공(정확하게는 그 비스무리한 것)이라는 값을 반환하는거다.
때문에 ODBC를 사용하는 사람은 스펙을 정확하게 이해하고 있어야한다. SQL_SUCCESS_WITH_INFO를 반환했을 때, 어떤 함수가 정말로 성공이라도 생각해도 되는건지, 어떤 함수는 실패한것은 아닌가 확인해 봐야 하는것인지를 가려야한다.
MSDN 등에서도 성공을 "SQL_SUCCESS 또는 SQL_SUCCESS_WITH_INFO"라는 조건으로 판단하고 있지만, 사실은 SQL_SUCCESS만을 (진정한 의미에서) 성공이라고 판단하도록 해야하는게 아닌가 싶다.
- 2009/03/30대단한 KLDP (EBS 라디오 듣기) [0]
- 2009/03/06클래스, 구성 요소 및 컨트롤(Class vs. Component... [0]
- 2009/03/05오묘한 SQL_SUCCESS_WITH_INFO [0]
- 2009/02/04[작성중] warning: the address of '?' will never... [0]
- 2008/12/22C 포인터와 const [0]
