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