Поделиться через


Обработка ошибок в собственных приложениях

Для приложений, разрабатываемых с помощью Microsoft Visual C++, сведения об ошибках можно получить в среде выполнения приложения, через поставщик данных или с помощью объектов элементов управления ошибками ActiveX и коллекций Microsoft SQL Server Compact 4.0. Использование объектов и коллекций элементов управления ошибками SQL Server Compact является методом обработки ошибок объектов Engine.

Извлечение сведений об ошибках

Приложения, написанные с помощью Microsoft Visual C++, могут получать от SQL Server Compact гораздо более подробные сведения по сравнению с HRESULT. Способ извлечения этих подробных сведений об ошибках зависит от метода, с помощью которого приложение взаимодействует с SQL Server Compact.

  • Объекты ошибок OLE DB

    Поставщик OLE DB для SQL Server Compact возвращает большой набор объектов ошибок, доступный с помощью объектов ошибок OLE DB. В объектах ошибок OLE DB сохраняются ошибки различных уровней и дополнительные сведения, выходящие за рамки стандартных ошибок. Дополнительные сведения см. в разделе Использование объектов ошибок OLE DB (SQL Server Compact).

  • Объекты и коллекции обнаружения ошибок SQL Server Compact

    Объекты Engine обнаруживают коллекции и параметры ошибок, к которым возможен доступ через Visual C++. Эти программы ссылаются на объекты и коллекции ошибок SQL Server, добавляя в проект файл sqlce_sync.h и ссылаясь на него директивой include. Дополнительные сведения см. в разделе Программирование собственного объекта ошибок (SQL Server Compact).

Использование собственных объектов и коллекций обнаружения ошибок

Коллекция SSCEErrors включает по одному объекту SSCEError на каждую сформированную ошибку. Каждый объект SSCEError содержит коллекцию SSCEParams. Описания ошибок можно получить из объектов SSCEParam в коллекции SSCEParams. SQL Server Compact, в отличие от SQL Server, возвращает подробные сведения об ошибке в виде коллекции из шести параметров. Создавая сообщения об ошибках, используйте серию вложенных циклов FOR для получения каждого объекта SSCEParam в коллекции SSCEParams для каждого объекта SSCEError.

Примеры

В следующем примере показано отображение ошибок объектов Engine с помощью Visual C++.

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

См. также

Другие ресурсы

Программирование собственного объекта ошибок (SQL Server Compact)