使用 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.
}