Partager via


Utilisation de SQLGetDiagRec et de SQLGetDiagField

Les applications appellent SQLGetDiagRec ou SQLGetDiagField pour récupérer des informations de diagnostic. Ces fonctions acceptent un handle d’environnement, de connexion, d’instruction ou de descripteur et retournent des diagnostics à partir de la fonction utilisée pour la dernière fois. Les diagnostics consignés sur un handle particulier sont dis carte ed lorsqu’une nouvelle fonction est appelée à l’aide de ce handle. Si la fonction a retourné plusieurs enregistrements de diagnostic, l’application appelle ces fonctions plusieurs fois ; le nombre total d’enregistrements d’état est récupéré en appelant SQLGetDiagField pour l’enregistrement d’en-tête (enregistrement 0) avec l’option SQL_DIAG_NUMo ER.

Les applications récupèrent des champs de diagnostic individuels en appelant SQLGetDiagField et en spécifiant le champ à récupérer. Certains champs de diagnostic n’ont aucune signification pour certains types de handles. Pour obtenir la liste des champs de diagnostic et leurs significations, consultez la description de la fonction SQLGetDiagField .

Les applications récupèrent le code d’erreur SQLSTATE, le code d’erreur natif et le message de diagnostic dans un seul appel en appelant SQLGetDiagRec ; SQLGetDiagRec ne peut pas être utilisé pour récupérer des informations à partir de l’enregistrement d’en-tête.

Par exemple, le code suivant invite l’utilisateur à entrer une instruction SQL et l’exécute. Si des informations de diagnostic ont été retournées, elle appelle SQLGetDiagField pour obtenir le nombre d’enregistrements d’état et SQLGetDiagRec pour obtenir le code d’erreur SQLSTATE, le code d’erreur natif et le message de diagnostic de ces enregistrements.

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