使用 SQLGetDiagRec 和 SQLGetDiagField

应用程序调用 SQLGetDiagRec 或 SQLGetDiagField 来检索诊断信息。 这些函数接受环境、连接、语句或描述符句柄,并从上次使用该句柄的函数返回诊断。 使用该句柄调用新函数时,将丢弃在特定句柄上记录的诊断。 如果函数返回了多个诊断记录,应用程序会多次调用这些函数;通过使用 SQL_DIAG_NUMBER 选项调用标题记录(记录 0)的 SQLGetDiagField 检索状态记录的总数。

应用程序通过调用 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.  
}