Udostępnij przez


Używanie poleceń SQLGetDiagRec i SQLGetDiagField

Aplikacje wywołują SQLGetDiagRec lub SQLGetDiagField w celu pobrania informacji diagnostycznych. Te funkcje akceptują uchwyt środowiska, połączenia, instrukcji lub deskryptora i zwracają diagnostykę z funkcji, która ostatnio korzystała z tego uchwytu. Diagnostyka zarejestrowana dla określonego uchwytu jest odrzucana, gdy nowa funkcja jest wywoływana przy użyciu tego uchwytu. Jeśli funkcja zwróciła wiele rekordów diagnostycznych, aplikacja wywołuje te funkcje wiele razy; całkowita liczba rekordów stanu jest pobierana przez wywołanie pola SQLGetDiagField dla rekordu nagłówka (rekord 0) z opcją SQL_DIAG_NUMBER.

Aplikacje pobierają poszczególne pola diagnostyczne, wywołując polecenie SQLGetDiagField i określając pole do pobrania. Niektóre pola diagnostyczne nie mają żadnego znaczenia dla niektórych typów uchwytów. Aby uzyskać listę pól diagnostycznych i ich znaczenia, zobacz opis funkcji SQLGetDiagField .

Aplikacje pobierają kod SQLSTATE, kod błędu natywnego i komunikat diagnostyczny w jednym wywołaniu, wywołując metodę SQLGetDiagRec; Nie można użyć polecenia SQLGetDiagRec do pobrania informacji z rekordu nagłówka.

Na przykład poniższy kod wyświetla użytkownikowi monit o instrukcję SQL i wykonuje go. Jeśli zostały zwrócone jakiekolwiek informacje diagnostyczne, wywołuje SQLGetDiagField, aby uzyskać liczbę rekordów stanu, oraz SQLGetDiagRec w celu pobrania kodu SQLSTATE, natywnego kodu błędu i komunikatu diagnostycznego z tych rekordów.

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