Compartir a través de


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