다음을 통해 공유


SQLGetDiagRec 및 SQLGetDiagField 사용

애플리케이션은 SQLGetDiagRec 또는 SQLGetDiagField를 호출하여 진단 정보를 검색합니다. 이러한 함수는 환경, 연결, 문 또는 설명자 핸들을 수락하고 해당 핸들을 마지막으로 사용한 함수에서 진단을 반환합니다. 특정 핸들에 기록된 진단은 해당 핸들을 사용하여 새 함수를 호출할 때 삭제됩니다. 함수가 여러 진단 레코드를 반환하는 경우 애플리케이션은 이러한 함수를 여러 번 호출합니다. SQL_DIAG_NUMBER 옵션을 사용하여 헤더 레코드(레코드 0)에 대해 SQLGetDiagField를 호출하여 총 상태 레코드 수를 검색합니다.

애플리케이션은 SQLGetDiagField를 호출하고 검색할 필드를 지정하여 개별 진단 필드를 검색합니다. 특정 진단 필드는 특정 유형의 핸들에 아무 의미가 없습니다. 진단 필드 및 해당 의미 목록은 SQLGetDiagField 함수 설명을 참조하세요.

애플리케이션은 SQLGetDiagRec를 호출하여 단일 호출에서 SQLSTATE, 네이티브 오류 코드 및 진단 메시지를 검색합니다.SQLGetDiagRec는 헤더 레코드에서 정보를 검색하는 데 사용할 수 없습니다.

예를 들어 다음 코드는 사용자에게 SQL 문을 묻는 메시지를 표시하고 실행합니다. 진단 정보가 반환된 경우 SQLGetDiagField를 호출하여 상태 레코드 수와 SQLGetDiagRec를 가져와 해당 레코드에서 SQLSTATE, 네이티브 오류 코드 및 진단 메시지를 가져옵니다.

SQLCHAR       SqlState[6], SQLStmt[100], Msg[SQL_MAX_MESSAGE_LENGTH];  
SQLINTEGER    NativeError;  
SQLSMALLINT   i, MsgLen;  
SQLRETURN     rc1, rc2;  
SQLHSTMT      hstmt;  
  
// Prompt the user for a SQL statement.  
GetSQLStmt(SQLStmt);  
  
// Execute the SQL statement and return any errors or warnings.  
rc1 = SQLExecDirect(hstmt, SQLStmt, SQL_NTS);  
if ((rc1 == SQL_SUCCESS_WITH_INFO) || (rc1 == SQL_ERROR)) {
   SQLLEN numRecs = 0;
   SQLGetDiagField(SQL_HANDLE_STMT, hstmt, 0, SQL_DIAG_NUMBER, &numRecs, 0, 0);
   // Get the status records.
   i = 1;  
   while (i <= numRecs && (rc2 = SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, SqlState, &NativeError,  
            Msg, sizeof(Msg), &MsgLen)) != SQL_NO_DATA) {  
      DisplayError(SqlState,NativeError,Msg,MsgLen);  
      i++;  
   }  
}  
  
if ((rc1 == SQL_SUCCESS) || (rc1 == SQL_SUCCESS_WITH_INFO)) {  
   // Process statement results, if any.  
}