共用方式為


使用 SQLGetDiagRec 和 SQLGetDiagField

應用程式會呼叫 SQLGetDiagRecSQLGetDiagField 來擷取診斷資訊。 這些函式接受環境、連線、陳述式或描述項控制代碼,並從最後使用該控制代碼的函式傳回診斷。 使用該控制代碼呼叫新函式時,會捨棄在特定控制代碼上的診斷記錄。 如果函式傳回多個診斷記錄,應用程式會多次呼叫這些函式;使用 SQL_DIAG_NUMBER 選項呼叫標頭記錄的 SQLGetDiagField (記錄 0) 即可擷取狀態記錄的總數。

應用程式會呼叫 SQLGetDiagField 並指定要擷取的欄位,以擷取個別的診斷欄位。 對於特定類型的控制代碼,某些診斷欄位沒有任何意義。 如需診斷欄位及其意義的清單,請參閱 SQLGetDiagField 函式描述。

應用程式會透過呼叫 SQLGetDiagRec,在單一呼叫中擷取 SQLSTATE、原生錯誤碼和診斷訊息;無法使用 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.  
}