네이티브 응용 프로그램의 오류 처리
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;
}