Dela via


Använda SQLGetDiagRec och SQLGetDiagField

Program anropar SQLGetDiagRec eller SQLGetDiagField för att hämta diagnostikinformation. Dessa funktioner accepterar en miljö, anslutning, anrop eller deskriptivt handtag och returnerar diagnostik från den funktion som använde handtaget senast. Diagnostiken som loggas på ett visst handtag ignoreras när en ny funktion anropas med det handtaget. Om funktionen returnerade flera diagnostikposter anropar programmet dessa funktioner flera gånger. det totala antalet statusposter hämtas genom att anropa SQLGetDiagField för rubrikposten (post 0) med alternativet SQL_DIAG_NUMBER.

Program hämtar enskilda diagnostikfält genom att anropa SQLGetDiagField och ange det fält som ska hämtas. Vissa diagnostikfält har ingen betydelse för vissa typer av handtag. En lista över diagnostikfält och deras betydelser finns i funktionsbeskrivningen för SQLGetDiagField .

Program hämtar SQLSTATE, intern felkod och diagnostikmeddelande i ett enda anrop genom att anropa SQLGetDiagRec. SQLGetDiagRec kan inte användas för att hämta information från rubrikposten.

Följande kod frågar till exempel användaren om en SQL-instruktion och kör den. Om någon diagnostikinformation returnerades anropas SQLGetDiagField för att hämta antalet statusposter och SQLGetDiagRec för att hämta SQLSTATE, intern felkod och diagnostikmeddelande från dessa poster.

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