다음을 통해 공유


커넥트ion 프로세스에서 드라이버 관리자의 역할

애플리케이션은 드라이버 함수를 직접 호출하지 않습니다. 대신 동일한 이름의 드라이버 관리자 함수를 호출하고 드라이버 관리자는 드라이버 함수를 호출합니다. 일반적으로 이 작업은 거의 즉시 발생합니다. 예를 들어 애플리케이션은 드라이버 관리자에서 SQLExecute를 호출하고 몇 가지 오류 검사 후 드라이버 관리자가 드라이버에서 SQLExecute를 호출 합니다.

연결 프로세스는 다릅니다. 애플리케이션이 SQL_HANDLE_ENV 및 SQL_HANDLE_DBC 옵션을 사용하여 SQLAllocHandle을 호출하는 경우 함수는 드라이버 관리자에서만 핸들을 할당합니다. 드라이버 관리자는 호출할 드라이버를 모르기 때문에 드라이버에서 이 함수를 호출하지 않습니다. 마찬가지로 애플리케이션이 연결되지 않은 연결의 핸들을 SQLSet커넥트Attr 또는 SQLGet커넥트Attr에 전달하는 경우 드라이버 관리자만 함수를 실행합니다. 설정되지 않았고 ODBC에서 기본값을 정의하지 않는 특성에 대한 값을 가져오는 경우 연결 핸들에서 특성 값을 저장하거나 가져오고 SQLSTATE 08003(커넥트이 열려 있지 않음)을 반환합니다.

애플리케이션이 SQL커넥트, SQLDriver커넥트 또는 SQLBrowse커넥트 호출하는 경우 드라이버 관리자는 먼저 사용할 드라이버를 결정합니다. 그런 다음 검사 드라이버가 현재 연결에 로드되어 있는지 여부를 확인합니다.

  • 연결에 로드된 드라이버가 없는 경우 드라이버 관리자는 지정된 드라이버가 동일한 환경의 다른 연결에 로드되는지 여부를 검사. 그렇지 않은 경우 드라이버 관리자는 연결에서 드라이버를 로드하고 SQL_HANDLE_ENV 옵션을 사용하여 드라이버에서 SQLAllocHandle을 호출합니다.

    그런 다음 드라이버 관리자는 방금 로드되었는지 여부에 관계없이 SQL_HANDLE_DBC 옵션을 사용하여 드라이버에서 SQLAllocHandle을 호출합니다. 애플리케이션에서 연결 특성을 설정하면 드라이버 관리자가 SQLSet커넥트Attr을 호출합니다. 오류가 발생하면 드라이버 관리자의 연결 함수는 SQLSTATE IM006(드라이버의 SQLSet커넥트Attr 실패)을 반환합니다. 마지막으로 드라이버 관리자는 드라이버의 연결 함수를 호출합니다.

  • 지정된 드라이버가 연결에 로드되면 드라이버 관리자는 드라이버의 연결 함수만 호출합니다. 이 경우 드라이버는 연결의 모든 연결 특성이 현재 설정을 기본 확인해야 합니다.

  • 연결에 다른 드라이버가 로드되면 드라이버 관리자는 드라이버에서 SQLFreeHandle을 호출하여 연결을 해제합니다. 드라이버를 사용하는 다른 연결이 없는 경우 드라이버 관리자는 드라이버에서 SQLFreeHandle을 호출하여 환경을 해제하고 드라이버를 언로드합니다. 그런 다음 드라이버 관리자는 드라이버가 연결에 로드되지 않은 경우와 동일한 작업을 수행합니다.

HandleType이 SQL_HANDLE_DBC 설정된 경우 드라이버 관리자는 드라이버의 SQLAllocHandleSQLFreeHandle을 호출하기 전에 환경 핸들(henv)을 잠급니다.

애플리케이션이 SQLDisconnect를 호출하면 드라이버 관리자는 드라이버에서 SQLDisconnect를 호출합니다. 그러나 애플리케이션이 드라이버에 다시 연결될 경우 드라이버가 로드된 상태로 남습니다. 애플리케이션이 SQL_HANDLE_DBC 옵션을 사용하여 SQLFreeHandle을 호출하면 드라이버 관리자는 드라이버에서 SQLFreeHandle을 호출 합니다. 다른 연결에서 드라이버를 사용하지 않는 경우 드라이버 관리자는 SQL_HANDLE_ENV 옵션을 사용하여 드라이버에서 SQLFreeHandle을 호출하고 드라이버를 언로드합니다.