Uso di SQLGetDiagRec e SQLGetDiagField
Le applicazioni chiamano SQLGetDiagRec o SQLGetDiagField per recuperare informazioni sulla diagnostica. Queste funzioni accettano handle di ambiente, connessione, istruzione o descrittore e restituiscono la diagnostica dalla funzione che ha usato per ultima tale handle. La diagnostica registrata in un handle specifico viene eliminata quando viene chiamata una nuova funzione usando tale handle. Se la funzione ha restituito più record di diagnostica, l'applicazione chiama queste funzioni più volte; il numero totale di record di stato viene recuperato chiamando SQLGetDiagField per il record di intestazione (record 0) con l'opzione SQL_DIAG_NUMBER.
Le applicazioni recuperano singoli campi di diagnostica chiamando SQLGetDiagField e specificando il campo da recuperare. Alcuni campi di diagnostica non hanno alcun significato per determinati tipi di handle. Per un elenco dei campi di diagnostica e del loro significato, vedere la descrizione della funzione SQLGetDiagField.
Le applicazioni recuperano il codice SQLSTATE, il codice di errore nativo e il messaggio di diagnostica in una sola chiamata a SQLGetDiagRec; non è possibile usare SQLGetDiagRec per recuperare informazioni dal record di intestazione.
Ad esempio, il codice seguente richiede all'utente un'istruzione SQL e la esegue. Se sono state restituite informazioni di diagnostica, chiama SQLGetDiagField per ottenere il numero di record di stato e SQLGetDiagRec per ottenere SQLSTATE, il codice di errore nativo e il messaggio di diagnostica da tali record.
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.
}