Uso de SQLGetDiagRec y SQLGetDiagField
Las aplicaciones llaman a SQLGetDiagRec o SQLGetDiagField para recuperar información de diagnóstico. Estas funciones aceptan un identificador de entorno, conexión, instrucción o descriptor y devuelven diagnósticos de la función que usó ese identificador por última vez. Los diagnósticos registrados en un identificador determinado se descartan cuando se llama a una nueva función mediante ese identificador. Si la función devolvió varios registros de diagnóstico, la aplicación llama a estas funciones varias veces; El número total de registros de estado se recupera llamando a SQLGetDiagField para el registro de encabezado (registro 0) con la opción SQL_DIAG_NUMBER.
Las aplicaciones recuperan campos de diagnóstico individuales llamando a SQLGetDiagField y especificando el campo que se va a recuperar. Algunos campos de diagnóstico no tienen ningún significado para determinados tipos de identificadores. Para obtener una lista de campos de diagnóstico y sus significados, consulte la descripción de la función SQLGetDiagField .
Las aplicaciones recuperan SQLSTATE, el código de error nativo y el mensaje de diagnóstico en una sola llamada llamando a SQLGetDiagRec; No se puede usar SQLGetDiagRec para recuperar información del registro de encabezado.
Por ejemplo, el código siguiente solicita al usuario una instrucción SQL y la ejecuta. Si se devolvió información de diagnóstico, llama a SQLGetDiagField para obtener el número de registros de estado y SQLGetDiagRec para obtener SQLSTATE, el código de error nativo y mensaje de diagnóstico de esos registros.
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.
}