Partilhar via


Usando SQLGetDiagRec e SQLGetDiagField

As aplicações chamam SQLGetDiagRec ou SQLGetDiagField para recuperar informação de diagnóstico. Estas funções aceitam um manipulador de ambiente, ligação, instrução ou descritor e devolvem diagnósticos da função que usou esse manipulador pela última vez. Os diagnósticos registados num determinado handle são descartados quando uma nova função é chamada usando esse handle. Se a função devolver múltiplos registos de diagnóstico, a aplicação chama essas funções várias vezes; o número total de registos de estado é recuperado chamando SQLGetDiagField para o registo de cabeçalho (registo 0) com a opção SQL_DIAG_NUMBER.

As aplicações recuperam campos de diagnóstico individuais chamando SQLGetDiagField e especificando o campo a recuperar. Certos campos de diagnóstico não têm qualquer significado para certos tipos de alavancos. Para uma lista de campos de diagnóstico e os seus significados, veja a descrição da função SQLGetDiagField .

As aplicações recuperam o SQLSTATE, o código de erro nativo e a mensagem de diagnóstico numa única chamada, chamando SQLGetDiagRec; O SQLGetDiagRec não pode ser usado para recuperar informação do registo de cabeçalho.

Por exemplo, o código seguinte solicita ao utilizador uma instrução SQL e executa-a. Se alguma informação de diagnóstico for devolvida, chama SQLGetDiagField para obter o número de registos de estado e SQLGetDiagRec para obter o SQLSTATE, código de erro nativo e mensagem de diagnóstico desses registos.

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.  
}