SQLGetDiagRec および SQLGetDiagField の使用

アプリケーションは、SQLGetDiagRec または SQLGetDiagField を呼び出して診断情報を取得します。 これらの関数は、環境、接続、ステートメント、または記述子ハンドルを受け入れ、そのハンドルを最後に使用した関数から診断を返します。 特定のハンドルにログオンした診断は、そのハンドルを使用して新しい関数が呼び出されると破棄されます。 関数が複数の診断レコードを返した場合、アプリケーションはこれらの関数を複数回呼び出します。SQL_DIAG_NUMBER オプションを指定してヘッダー レコード (レコード 0) の SQLGetDiagField を呼び出すことによって、状態レコードの合計数が取得されます。

アプリケーションは、SQLGetDiagField を呼び出し、取得するフィールドを指定することで、個々の診断フィールドを取得します。 特定の診断フィールドには、特定の種類のハンドルに対する意味はありません。 診断フィールドとその意味の一覧については、「SQLGetDiagField 関数の説明」を参照してください。

アプリケーションは、SQLGetDiagRec を呼び出して、1 回の呼び出しで 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 an 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.  
}