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

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

エラー情報の取得

Microsoft Visual 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 を使用して、ReplicationRemoteDataAccess、および 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)

ヘルプおよび情報

サポートについて (SQL Server Compact 3.5 Service Pack 1)