네이티브 응용 프로그램의 오류 처리

Microsoft Visual C++를 사용하여 개발하는 응용 프로그램의 경우 응용 프로그램 런타임 또는 데이터 공급자로부터 오류 정보를 얻거나 Microsoft SQL Server Compact 4.0 ActiveX 오류 제어 개체 또는 컬렉션을 사용하여 오류 정보를 얻을 수 있습니다. SQL Server Compact 오류 제어 개체 및 컬렉션을 사용하는 것은 Engine 개체 오류를 처리하는 방법입니다.

MicrosoftVisual C++로 작성된 응용 프로그램은 HRESULT보다 SQL Server Compact에서 자세한 정보를 검색할 수 있습니다. 확장 오류 정보를 검색하는 방법은 응용 프로그램이 SQL Server Compact과 상호 작용하기 위해 다음 중 어떤 방법을 사용하는가에 따라 달라집니다.

  • OLE DB 오류 개체

    SQL Server Compact용 OLE DB 공급자는 OLE DB 오류 개체를 사용하여 액세스할 수 있는 다양한 오류 개체를 반환합니다. OLE DB 오류 개체는 여러 계층의 오류를 저장하여 일반 오류 이상의 추가 정보를 제공합니다. 자세한 내용은 OLE DB 오류 개체 사용(SQL Server Compact)을 참조하십시오.

  • SQL Server Compact 오류 제어 개체 및 컬렉션

    Engine 개체는 Visual C++를 통해 액세스할 수 있는 오류 컬렉션 및 매개 변수를 표시합니다. 이 네이티브 프로그램은 sqlce_sync.hto를 프로젝트 참조에 추가하고 include 지시문을 사용하여 이 파일을 참조하는 방식으로 SQL Server의 오류 개체 및 컬렉션을 참조합니다. 자세한 내용은 원시 오류 개체 프로그래밍(SQL Server Compact)를 참조하십시오.

SSCEErrors 컬렉션에는 생성된 각각의 오류에 대한 SSCEError 개체가 포함되어 있습니다. 각 SSCEError 개체에는 SSCEParams 컬렉션이 포함되어 있습니다. 오류에 대한 설명은 SSCEParams 컬렉션의 SSCEParam 개체에서 검색할 수 있습니다. SQL Server와 달리 SQL Server Compact에서는 6개의 매개 변수 컬렉션으로 오류에 대한 자세한 정보를 반환합니다. 오류 메시지를 작성할 때는 SSCEError 개체 각각에 대한 SSCEParams 컬렉션에서 각 SSCEParam 개체를 검색할 수 있도록 일련의 중첩된 FOR 루프를 사용하십시오.

다음 예에서는 Visual C++를 사용하여 Engine 개체 오류를 표시하는 방법을 보여 줍니다.

// 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;
}
표시: