Использование SQLGetDiagRec и SQLGetDiagField
Приложения вызывают SQLGetDiagRec или SQLGetDiagField для получения диагностических сведений. Эти функции принимают дескриптор среды, соединения, инструкции или дескриптора и возвращают диагностика из функции, которая последний раз использовала этот дескриптор. Диагностика, вошедший в определенный дескриптор, удаляется при вызове новой функции с помощью этого дескриптора. Если функция возвращала несколько диагностических записей, приложение вызывает эти функции несколько раз; Общее количество записей состояния извлекается путем вызова SQLGetDiagField для записи заголовка (запись 0) с параметром SQL_DIAG_NUMBER.
Приложения получают отдельные поля диагностики, вызывая SQLGetDiagField и указывая поле для извлечения. Некоторые диагностические поля не имеют никакого значения для определенных типов дескрипторов. Список полей диагностики и их значения см. в описании функции SQLGetDiagField .
Приложения получают SQLSTATE, собственный код ошибки и диагностическое сообщение в одном вызове путем вызова SQLGetDiagRec; SQLGetDiagRec нельзя использовать для получения сведений из записи заголовка.
Например, следующий код запрашивает пользователя для инструкции SQL и выполняет его. Если были возвращены диагностические сведения, он вызывает SQLGetDiagField , чтобы получить количество записей состояния и SQLGetDiagRec для получения SQLSTATE, машинного кода ошибки и диагностического сообщения из этих записей.
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.
}