Compartir a través de


Control de errores en las aplicaciones nativas

En el caso de las aplicaciones desarrolladas con Microsoft Visual C++ for Devices, la información de errores puede obtenerse a partir del tiempo de ejecución de la aplicación, del proveedor de datos o mediante las colecciones y los objetos de control de errores ActiveX de Microsoft SQL Server Compact 3.5 (SQL Server Compact 3.5). El uso de las colecciones y los objetos de control de errores de SQL Server Compact 3.5 constituye el método para controlar los errores de los objetos Replication, RemoteDataAccess y Engine.

Recuperación de información sobre errores

Las aplicaciones escritas con Microsoft Visual C++ for Devices pueden recibir mucha más información detallada de SQL Server Compact 3.5 que HRESULT. La forma de recuperar de esta información de errores ampliada depende del método (de los que se muestran a continuación) que usa la aplicación para interactuar con SQL Server Compact 3.5:

  • Objetos de error OLE DB
    El proveedor OLE DB para SQL Server Compact 3.5 devuelve un conjunto de objetos de error completo al cual se puede obtener acceso mediante objetos de error de OLE DB. Los objetos de error OLE DB almacenan varios niveles de errores y proporcionan información adicional a la de los errores estándar. Para obtener más información, vea Usar los objetos de error de OLE DB (SQL Server Compact).
  • Colecciones y objetos de control de errores de SQL Server Compact 3.5
    Los objetos Replication, RemoteDataAccess y Engine revelan colecciones y parámetros de error a los que se puede obtener acceso mediante Visual C++. Estos programas nativos hacen referencia a las colecciones y los objetos de error de SQL Server agregando sqlce_sync.hto a las referencias del proyecto y haciendo referencia a estos archivos con la directiva include.Para obtener más información, vea Programar el objeto Native Error (SQL Server Compact).

Usar los objetos y colecciones de control de errores nativos

La colección SSCEErrors contiene un objeto SSCEError por cada error generado. Cada objeto SSCEError contiene una colección SSCEParams. La descripción de los errores se puede recuperar en los objetos SSCEParam de la colección SSCEParams. A diferencia de SQL Server, SQL Server Compact 3.5 devuelve información detallada acerca de un error en forma de colección de seis parámetros. Al crear mensajes de error, use una serie de bucles FOR anidados para recuperar cada objeto SSCEParam de la colección SSCEParams de cada objeto SSCEError.

Ejemplos

El ejemplo siguiente ilustra cómo mostrar los errores de los objetos Replication, RemoteDataAccess y Engine mediante Visual C++ for Devices.

// Error handling example
#include     "sqlce_sync.h"

void    ShowErrors(ISSCEErrors* pISSCEErrors)
{
HRESULT       hr;
LONG          cbBuf;
LONG          i;
LONG          lErrorCount;
LONG          lErrorIndex;
LONG          lParamCount;
LONG          lParamIndex;
VARIANT       var;
VARIANT       varParam;
WCHAR         wszBuff[4096];
WCHAR*        pwszBuffPos   = &wszBuff[0];
BSTR          bstr;
ISSCEError*   pISSCEError   = NULL;
ISSCEParams*  pISSCEParams  = NULL;
ISSCEParam*   pISSCEParam   = NULL;
BOOL          fSuccess      = FALSE;

// Initialize the variants.
VariantInit(&var);
VariantInit(&varParam);

// Get the count of errors.
if(FAILED(hr = pISSCEErrors->get_Count(&lErrorCount))) goto Exit;
if (lErrorCount <= 0)
    {
    MessageBox(NULL, L"No extended error information.",L"ShowErrors", MB_OK);
    fSuccess = TRUE;
    goto Exit;
    }

// Display errors, one at a time, in a single message box.
// If there are too many errors, they might not all display correctly.
// If so, we recommend that you perform logic based on the number of errors.
for (lErrorIndex = 0; lErrorIndex < lErrorCount; lErrorIndex++)
    {
    cbBuf = swprintf(pwszBuffPos, L"E R R O R  %d of %d\r\n",
        lErrorIndex+1, lErrorCount);
    pwszBuffPos += cbBuf;

    // Get the next error record.
    var.vt = VT_I4;
    var.lVal = lErrorIndex;
    if(FAILED(hr = pISSCEErrors->get_Item(var, &pISSCEError))) goto Exit;

    // Error description
    if (FAILED(hr = pISSCEError->get_Description(&bstr))) goto Exit;
    cbBuf = swprintf(pwszBuffPos, L"DESCRIPTION: '%s'\r\n", bstr);
    pwszBuffPos += cbBuf;
    SysFreeString(bstr);

    // Error number
    if (FAILED(hr = pISSCEError->get_Number(&i))) goto Exit;
    cbBuf = swprintf(pwszBuffPos, L"NUMBER: %8.8X\r\n", i);
    pwszBuffPos += cbBuf;

    // Native error
    if (FAILED(hr = pISSCEError->get_NativeError(&i))) goto Exit;
    cbBuf = swprintf(pwszBuffPos, L"NATIVE_ERROR: %d\r\n", i);
    pwszBuffPos += cbBuf;

    // Error source
    if (FAILED(hr = pISSCEError->get_Source(&bstr))) goto Exit;
    cbBuf = swprintf(pwszBuffPos, L"SOURCE: '%s'\r\n", bstr);
    pwszBuffPos += cbBuf;
    SysFreeString(bstr);

    // Retrieve the error parameters.
    if (FAILED(hr = pISSCEError->get_Params(&pISSCEParams))) goto Exit;

    // Get the number of error parameters.
    if (FAILED(hr = pISSCEParams->get_Count(&lParamCount))) goto Exit;

    // Display the value of each parameter.
    for (lParamIndex = 0; lParamIndex < lParamCount; lParamIndex++)
        {

        // Get the parameter object.
        var.vt = VT_I4;
        var.lVal = lParamIndex;
        if (FAILED(hr = pISSCEParams->get_Item(var, &pISSCEParam))) goto Exit;

        // Get and display the parameter value.
        if (FAILED(hr = pISSCEParam->get_Param(&varParam))) goto Exit;
        if (VT_I4 == varParam.vt || VT_UI4 == varParam.vt)
            {
            cbBuf = swprintf(pwszBuffPos, L"P%d: %d\r\n", lParamIndex,
                (LONG) varParam.lVal);
            }
        else if (VT_I2 == varParam.vt || VT_UI2 == varParam.vt)
            {
            cbBuf = swprintf(pwszBuffPos, L"P%d: %d\r\n", lParamIndex,
                (LONG) varParam.iVal);
            }
        else if (VT_BSTR == varParam.vt)
            {
            cbBuf = swprintf(pwszBuffPos, L"P%d: '%s'\r\n", lParamIndex, 
                varParam.bstrVal);
            }
        pwszBuffPos += cbBuf;

        // Clear the variant.
        VariantClear(&varParam);

        // Release the parameter object.
        pISSCEParam->Release();
        pISSCEParam = NULL;
        }
    cbBuf = swprintf(pwszBuffPos, L"\r\n");
    pwszBuffPos += cbBuf;

    }

// Display the error information.

MessageBox(NULL, wszBuff,L"Error", MB_OK);
fSuccess = TRUE;

Exit:
// Release the parameter object.
if (pISSCEParam)
    {
    pISSCEParam->Release();
    pISSCEParam = NULL;
    }

// Release the parameters object.
if (pISSCEParams)
    {
    pISSCEParams->Release();
    pISSCEParams = NULL;
    }

// Release the error object.
if (pISSCEError)
    {
    pISSCEError->Release();
    pISSCEError = NULL;
    }

// The Errors object is released in calling routine.
if (!fSuccess)
    {
    MessageBox(NULL, L"Error while processing errors!",L"ShowErrors", MB_OK);
    }
return;
}

Vea también

Otros recursos

Programar el objeto Native Error (SQL Server Compact)

Ayuda e información

Obtener ayuda (SQL Server Compact 3.5 Service Pack 1)