진단 레코드 및 필드
진단 레코드는 ODBC 환경, 연결, 문 또는 설명자 핸들과 연결되어 있습니다. ODBC 함수가 SQL_SUCCESS 또는 SQL_INVALID_HANDLE이 아닌 반환 코드를 생성하는 경우 해당 함수에서 호출된 핸들에 정보 또는 오류 메시지가 포함된 진단 레코드가 연결되어 있습니다. 이러한 레코드는 해당 핸들을 사용하여 다른 함수를 호출할 때까지 유지되며, 이때 레코드가 삭제됩니다. 한 번에 핸들에 연결할 수 있는 진단 레코드 수에는 제한이 없습니다.
두 가지 유형의 진단 레코드(헤더 및 상태)가 있습니다. 헤더 레코드는 레코드 0이고, 상태 레코드가 있을 경우 레코드 1 이상이 됩니다. 진단 레코드에는 헤더 레코드 및 상태 레코드에 대한 여러 필드가 포함됩니다. ODBC 구성 요소에서 해당 진단 레코드 필드를 정의할 수도 있습니다.
헤더 레코드의 필드에는 반환 코드, 행 수, 상태 레코드 수, 실행된 문 유형 등 함수 실행에 대한 일반 정보가 포함됩니다. ODBC 함수에서 SQL_INVALID_HANDLE을 반환하지 않을 경우 헤더 레코드는 항상 생성됩니다. 헤더 레코드에 있는 필드의 전체 목록을 보려면 SQLGetDiagField를 참조하십시오.
상태 레코드의 필드에는 SQLSTATE, 원시 오류 번호, 진단 메시지, 열 번호 및 행 번호를 비롯하여 ODBC 드라이버 관리자, 드라이버 또는 데이터 원본에서 반환된 특정 오류 또는 경고에 대한 정보가 포함됩니다. 상태 레코드는 함수에서 SQL_ERROR, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_NEED_DATA 또는 SQL_STILL_EXECUTING을 반환하는 경우에만 생성됩니다. 상태 레코드에 있는 필드의 전체 목록을 보려면 SQLGetDiagField를 참조하십시오.
SQLGetDiagRec는 ODBC SQLSTATE, 원시 오류 번호 및 진단 메시지 필드와 함께 단일 진단 레코드를 검색합니다. 이 기능은 ODBC 2.xSQLError 함수와 유사합니다. ODBC 3.x의 가장 간단한 오류 처리 함수는 1로 설정된 RecNumber 매개 변수부터 시작하여 SQLGetDiagRec에서 SQL_NO_DATA를 반환할 때까지 RecNumber를 1씩 증가하여 SQLGetDiagRec를 반복해서 호출하는 것입니다. 이 함수는 SQL_NO_DATA_FOUND가 반환될 때까지 SQLError를 호출하는 ODBC 2.x 응용 프로그램과 같습니다.
ODBC 3.x는 ODBC 2.x보다 더 많은 진단 정보를 지원합니다. 이 정보는 SQLGetDiagField를 사용하여 검색된 진단 레코드의 추가 필드에 저장됩니다.
SQL Server Native Client ODBC 드라이버에는 SQLGetDiagField를 사용하여 검색할 수 있는 드라이버별 진단 필드가 있습니다. 이러한 드라이버별 필드의 레이블은 sqlncli.h에서 정의됩니다. 해당 레이블을 사용하여 각 진단 레코드와 연결된 SQL Server 상태, 심각도 수준, 서버 이름, 프로시저 이름 및 줄 번호를 검색합니다. 또한 sqlncli.h에는 응용 프로그램이 DiagIdentifier를 SQL_DIAG_DYNAMIC_FUNCTION_CODE로 설정하여 SQLGetDiagField를 호출할 경우 드라이버에서 Transact-SQL 문을 식별하는 데 사용하는 코드 정의가 들어 있습니다.
SQLGetDiagField는 기본 드라이버에서 캐시한 오류 정보를 사용하여 ODBC 드라이버 관리자에 의해 처리됩니다. ODBC 드라이버 관리자는 성공적으로 연결될 때까지 드라이버별 진단 필드를 캐시하지 않습니다. 성공적으로 연결되기 전에 드라이버별 진단 필드를 가져오기 위해 SQLGetDiagField를 호출하면 SQL_ERROR가 반환됩니다. ODBC 연결 함수에서 SQL_SUCCESS_WITH_INFO를 반환할 경우 해당 연결 함수의 드라이버별 진단 필드를 아직 사용할 수 없습니다. 연결 함수 뒤에 다른 ODBC 함수를 호출한 후에만 드라이버별 진단 필드에 대해 SQLGetDiagField 호출을 시작할 수 있습니다.
SQL Server Native Client ODBC 드라이버에서 보고되는 대부분의 오류는 SQLGetDiagRec에서 반환된 정보만 사용하여 효과적으로 진단할 수 있습니다. 하지만 일부 경우에서는 오류를 진단할 때 드라이버별 진단 필드에서 반환된 정보가 중요합니다. SQL Server Native Client ODBC 드라이버를 사용하는 응용 프로그램에 대해 ODBC 오류 처리기를 코딩하는 경우 SQLGetDiagField를 사용하여 최소한 SQL_DIAG_SS_MSGSTATE 및 SQL_DIAG_SS_SEVERITY 드라이버별 필드를 검색하는 것이 좋습니다. SQL Server 코드의 여러 위치에서 특정 오류가 발생할 수 있는 경우 SQL_DIAG_SS_MSGSTATE를 통해 Microsoft 지원 엔지니어가 오류 발생 위치를 구체적으로 확인할 수 있으므로 문제 진단에 도움이 됩니다.