Freigeben über


Handhaben von Fehlern in systemeigenen Anwendungen

Für Anwendungen, die Sie mit Microsoft Visual C++ entwickeln, können Fehlerinformationen durch die Laufzeitumgebung der Anwendung oder vom Datenanbieter generiert bzw. dadurch ermittelt werden, dass die ActiveX-Fehlersteuerungsobjekte und -auflistungen von Microsoft SQL Server Compact 4.0 verwendet werden. Das Verwenden der SQL Server Compact-Fehlersteuerungsobjekte und -auflistungen ermöglicht die Behandlung von Fehlern des Engine-Objekts.

Abrufen von Fehlerinformationen

Anwendungen, die mit Microsoft Visual C++ geschrieben wurden, können viel ausführlichere Informationen von SQL Server Compact erhalten als HRESULT-Rückgabewerte. Auf welche Weise Sie diese erweiterten Fehlerinformationen abrufen, hängt davon ab, welche der folgenden Methoden die Anwendung zur Interaktion mit SQL Server Compact verwendet:

  • OLE DB-Fehlerobjekte

    Der OLE DB-Anbieter für SQL Server Compact gibt eine umfassende Menge von Fehlerobjekten zurück, auf die mit OLE DB-Fehlerobjekten zugegriffen werden kann. Die OLE DB-Fehlerobjekte speichern mehrere Ebenen von Fehlern und bieten weitere Informationen über die Standardfehler hinaus. Weitere Informationen finden Sie unter Verwenden von OLE DB-Fehlerobjekten (SQL Server Compact).

  • SQL Server Compact-Fehlerobjekte und -auflistungen

    Die Engine-Objekte legen Fehlerauflistungen und -parameter offen, auf die über Visual C++ zugegriffen werden kann. Diese systemeigenen Programme können auf die SQL Server-Fehlerobjekte und -auflistungen verweisen, indem sqlce_sync.hto den Projektverweisen hinzugefügt und auf diese Dateien mit der include-Direktive verwiesen wird. Weitere Informationen finden Sie unter Programmieren des systemeigenen Fehlerobjekts (SQL Server Compact).

Verwenden der systemeigenen Fehlersteuerungsobjekte und -auflistungen

Die SSCEErrors-Auflistung enthält ein SSCEError-Objekt für jeden generierten Fehler. Jedes SSCEError-Objekt enthält eine SSCEParams-Auflistung. Die Beschreibungen von Fehlern können aus SSCEParam-Objekten in der SSCEParams-Auflistung abgerufen werden. Im Gegensatz zu SQL Server gibt SQL Server Compact ausführliche Informationen zu einem Fehler als Auflistung von sechs Parametern zurück. Wenn Sie Fehlermeldungen erstellen, verwenden Sie eine Reihe geschachtelter FOR-Schleifen, um das jeweilige SSCEParam-Objekt in der SSCEParams-Auflistung für jedes SSCEError-Objekt abzurufen.

Beispiele

Das folgende Beispiel zeigt, wie die Engine-Objektfehler mithilfe von Visual C++ angezeigt werden.

// 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;
}

Siehe auch

Andere Ressourcen

Programmieren des systemeigenen Fehlerobjekts (SQL Server Compact)