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 ignorés 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_NUMBER.
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 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.
}