ネイティブ アプリケーションでのエラー処理
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;
}