Verwenden von SQLGetDiagRec und SQLGetDiagField

Anwendungen rufen SQLGetDiagRec oder SQLGetDiagField auf, um Diagnoseinformationen abzurufen. Diese Funktionen akzeptieren eine Umgebung, Verbindung, Anweisung oder Beschreibungshandle und geben Diagnose von der Funktion zurück, die zuletzt dieses Handle verwendet hat. Die Diagnose, die bei einem bestimmten Handle angemeldet sind Karte wenn eine neue Funktion mit diesem Handle 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 ihn 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 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.  
}