개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.05.20 10:03

OCI 연결 종료 오류 해결 방법

목록
  • 디자인패턴마스터 11일 전 2025.05.20 10:03
  • 22
    1
제가 Oracle의 OCI 연결을 사용하여 데이터베이스에 접속할 때, oci_close() 함수를 사용하여 연결을 종료하려고 합니다. 하지만, 어떤 경우에는 연결이 종료되지 않고 오류가 발생합니다. 예를 들어, 다음과 같은 경우가 있습니다.

c

#include 



int main() {

    OCIEnv *env;

    OCISvcCtx *svctx;

    OCIError *err;



    // 데이터베이스에 접속

    OCIEnvCreate(&env, OCI_DEFAULT, 0, 0, 0, 0, 0, 0);

    OCIHandleAlloc(env, (dvoid )&err, OCI_HTYPE_ERROR, 0, 0);

    OCIHandleAlloc(env, (dvoid )&svctx, OCI_HTYPE_SVCCTX, 0, 0);



    // 데이터베이스에 연결

    OCILogon(env, err, &svctx, (OCILogonAuthInfo *)0, 0, 0, 0);



    // 데이터베이스 작업 수행



    // 데이터베이스 연결 종료

    OCIHandleFree(svctx, OCI_HTYPE_SVCCTX);

    OCIHandleFree(err, OCI_HTYPE_ERROR);

    OCIEnvFree(env, OCI_DEFAULT);



    return 0;

}



이 코드에서, OCIEnvFree(env, OCI_DEFAULT) 함수를 호출하여 OCIEnv 객체를 해제하고 OCIHandleFree(svctx, OCI_HTYPE_SVCCTX) 함수를 호출하여 OCISvcCtx 객체를 해제합니다. 하지만, 데이터베이스 연결이 종료되지 않습니다. 오류가 발생하는 이유는 무엇이며, 데이터베이스 연결을 종료하는 올바른 방법은 무엇입니까?

    댓글목록

    profile_image
    나우호스팅  11일 전



    OCIEnvFree(env, OCI_DEFAULT) 함수를 호출하여 OCIEnv 객체를 해제하고 OCIHandleFree(svctx, OCI_HTYPE_SVCCTX) 함수를 호출하여 OCISVCtx 객체를 해제하는 방법은 올바른 방법입니다.

    그러나, OCILogon 함수를 호출하여 데이터베이스에 연결한 후, OCIHandleFree(err, OCI_HTYPE_ERROR) 함수를 호출하여 OCIError 객체를 해제하는 것은 올바르지 않습니다.

    OCIError 객체를 해제하기 전에, OCIHandleFree(svctx, OCI_HTYPE_SVCCTX) 함수를 호출하여 OCISVCtx 객체를 해제하고 OCIEnvFree(env, OCI_DEFAULT) 함수를 호출하여 OCIEnv 객체를 해제해야 합니다.

    또한, OCIHandleFree(err, OCI_HTYPE_ERROR) 함수를 호출하기 전에, OCIErrorGet 함수를 호출하여 오류 코드를 확인하고, 오류가 발생한 경우, OCIErrorGet 함수를 호출하여 오류 메시지를 확인해야 합니다.

    오류가 발생한 경우, OCIHandleFree(err, OCI_HTYPE_ERROR) 함수를 호출하기 전에, 오류를 처리하는 코드를 추가해야 합니다.

    예를 들어, 다음과 같이 코드를 수정할 수 있습니다.

    #hostingforum.kr
    c
    
    #include 
    
    
    
    int main() {
    
        OCIEnv *env;
    
        OCISvcCtx *svctx;
    
        OCIError *err;
    
    
    
        // 데이터베이스에 접속
    
        OCIEnvCreate(&env, OCI_DEFAULT, 0, 0, 0, 0, 0, 0);
    
        OCIHandleAlloc(env, (dvoid *)&err, OCI_HTYPE_ERROR, 0, 0);
    
        OCIHandleAlloc(env, (dvoid *)&svctx, OCI_HTYPE_SVCCTX, 0, 0);
    
    
    
        // 데이터베이스에 연결
    
        OCILogon(env, err, &svctx, (OCILogonAuthInfo *)0, 0, 0, 0);
    
    
    
        // 데이터베이스 작업 수행
    
    
    
        // 데이터베이스 연결 종료
    
        OCIHandleFree(svctx, OCI_HTYPE_SVCCTX);
    
        OCIErrorGet(err, 1, 0, 0, 0, 0, 0, 0, 0);
    
        if (OCIErrorGet(err, 1, 0, 0, 0, 0, 0, 0, 0) == 0) {
    
            OCIHandleFree(err, OCI_HTYPE_ERROR);
    
        }
    
        OCIEnvFree(env, OCI_DEFAULT);
    
    
    
        return 0;
    
    }
    
    


    이 코드에서는 OCIErrorGet 함수를 호출하여 오류 코드를 확인하고, 오류가 발생한 경우, 오류 메시지를 확인합니다. 오류가 발생하지 않은 경우, OCIHandleFree 함수를 호출하여 OCIError 객체를 해제합니다.

    2025-05-20 10:04

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 24,027건 / 19 페이지

검색

게시물 검색