Поделиться через


Использование 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.  
}