Verwenden von SQLGetDiagRec und SQLGetDiagField

Anwendungen rufen SQLGetDiagRec oder SQLGetDiagField auf, um Diagnoseinformationen abzurufen. Diese Funktionen akzeptieren eine Umgebung, Verbindung, Anweisung oder Deskriptorbehandlung und Rückgabediagnose von der Funktion, die zuletzt dieses Handle verwendet hat. Die Diagnose, die bei einem bestimmten Handle angemeldet ist, wird verworfen, wenn eine neue Funktion mithilfe dieses Handles aufgerufen wird. Wenn die Funktion mehrere Diagnosedatensätze zurückgegeben hat, ruft die Anwendung diese Funktionen mehrmals auf; Die Gesamtzahl der Statusdatensätze wird durch Aufrufen von SQLGetDiagField für den Headerdatensatz (Datensatz 0) mit der Option SQL_DIAG_NUMBER abgerufen.

Anwendungen rufen einzelne Diagnosefelder ab, indem SIE SQLGetDiagField aufrufen und das abzurufende Feld angeben. Bestimmte Diagnosefelder haben keine Bedeutung für bestimmte Arten von Handles. Eine Liste der Diagnosefelder und deren Bedeutung finden Sie in der Beschreibung der SQLGetDiagField-Funktion .

Anwendungen rufen den SQLSTATE-, systemeigenen Fehlercode und die Diagnosenachricht in einem einzigen Aufruf ab, indem SQLGetDiagRec aufgerufen wird; SQLGetDiagRec kann nicht zum Abrufen von Informationen aus dem Headerdatensatz verwendet werden.

Der folgende Code fordert beispielsweise den Benutzer zur Eingabe einer SQL-Anweisung auf und führt sie aus. Wenn Diagnoseinformationen zurückgegeben wurden, ruft sie SQLGetDiagField auf, um die Anzahl der Statusdatensätze und SQLGetDiagRec abzurufen, um sqlSTATE, systemeigener Fehlercode und Diagnosemeldungen aus diesen Datensätzen abzurufen.

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