ネイティブ アプリケーションでのエラー処理

Microsoft Visual C++ for Devices でアプリケーションを開発する場合、エラー情報は、アプリケーション ランタイム、データ プロバイダー、または Microsoft SQL Server Compact 3.5 ActiveX のエラー コントロール オブジェクトとエラー コントロール コレクションから取得できます。Replication オブジェクト、RemoteDataAccess オブジェクト、および Engine オブジェクトのエラーを処理するには、SQL Server Compact 3.5 のエラー コントロール オブジェクトとエラー コントロール コレクションを使用します。

エラー情報の取得

MicrosoftVisual C++ for Devices で作成されたアプリケーションは、HRESULT よりも詳細な情報を SQL Server Compact 3.5 から取得できます。この詳細エラー情報の取得方法は、アプリケーションで SQL Server Compact 3.5 との対話にどの方法が使用されているかによって異なります。

  • OLE DB エラー オブジェクト

    OLE DB Provider for SQL Server Compact 3.5 は、さまざまなエラー オブジェクトのセットを返します。これらのエラー オブジェクトには、OLE DB エラー オブジェクトを使用してアクセスできます。OLE DB エラー オブジェクトは、複数の層のエラーを格納し、標準エラーよりも詳細な情報を提供します。詳細については、「OLE DB エラー オブジェクトの使用 (SQL Server Compact)」を参照してください。

  • SQL Server Compact 3.5 のエラー コントロール オブジェクトとエラー コントロール コレクション

    Replication オブジェクト、RemoteDataAccess オブジェクト、および Engine オブジェクトでは、Visual C++ からアクセスできるエラー コレクションやパラメータを利用できます。これらのネイティブ プログラムで SQL Server のエラー オブジェクトとエラー コレクションを参照するには、sqlce_sync.h をプロジェクトの参照設定に追加し、include ディレクティブを使用してこれらのファイルを参照します。詳細については、「ネイティブ エラー オブジェクトのプログラミング (SQL Server Compact)」を参照してください。

ネイティブ エラー コントロール オブジェクトおよびコレクションの使用

SSCEErrors コレクションには、生成されたエラー 1 つにつき 1 つの SSCEError オブジェクトが格納されます。各 SSCEError オブジェクトには、SSCEParams コレクションが含まれています。エラーの詳細情報は、SSCEParams コレクションの SSCEParam オブジェクトから取得できます。SQL Server と異なり、SQL Server Compact 3.5 はエラーに関する詳細情報を 6 つのパラメータのコレクションとして返します。エラー メッセージを作成するとき、一連の FOR ループを入れ子にして、各 SSCEError オブジェクトに含まれる SSCEParams コレクションの SSCEParam オブジェクトをそれぞれ取得します。

次の例では、Visual C++ for Devices を使用して、Replication、RemoteDataAccess、および 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;
}

関連項目

その他の技術情報

ネイティブ エラー オブジェクトのプログラミング (SQL Server Compact)