Compartilhar via


Usar SQLGetDiagRec e SQLGetDiagField

Os aplicativos chamam SQLGetDiagRec ou SQLGetDiagField para recuperar informações de diagnóstico. Essas funções aceitam um identificador de descritor, ambiente, conexão ou instrução e retornam diagnósticos da função que usou esse identificador pela última vez. Os diagnósticos registrados em um identificador específico são descartados quando uma nova função é chamada usando esse identificador. Se a função retornou vários registros de diagnóstico, o aplicativo chama essas funções diversas vezes; o número total de registros de status é recuperado chamando SQLGetDiagField para o registro de cabeçalho (registro 0) com a opção SQL_DIAG_NUMBER.

Os aplicativos recuperam campos de diagnóstico individuais chamando SQLGetDiagField e especificando o campo a ser recuperado. Determinados campos de diagnóstico não têm significado para determinados tipos de identificadores. Para obter uma lista de campos de diagnóstico e seus significados, consulte a descrição da função SQLGetDiagField.

Os aplicativos recuperam o SQLSTATE, o código de erro nativo e a mensagem de diagnóstico em uma única chamada, chamando SQLGetDiagRec; SQLGetDiagRec não pode ser usado para recuperar informações do registro de cabeçalho.

Por exemplo, o código a seguir solicita ao usuário uma instrução SQL e a executa. Se informações de diagnóstico forem retornadas, ele chamará SQLGetDiagField para obter o número de registros de status e SQLGetDiagRec para obter o SQLSTATE, o código de erro nativo e a mensagem de diagnóstico desses registros.

SQLCHAR       SqlState[6], SQLStmt[100], Msg[SQL_MAX_MESSAGE_LENGTH];  
SQLINTEGER    NativeError;  
SQLSMALLINT   i, MsgLen;  
SQLRETURN     rc1, rc2;  
SQLHSTMT      hstmt;  
  
// Prompt the user for an 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.  
}