Обработка ошибок в собственных приложениях
Для приложений, разрабатываемых с помощью Microsoft Visual C++, сведения об ошибках можно получить в среде выполнения приложения, через поставщик данных или с помощью объектов элементов управления ошибками ActiveX и коллекций Microsoft SQL Server Compact 4.0. Использование объектов и коллекций элементов управления ошибками SQL Server Compact является методом обработки ошибок объектов Engine.
Извлечение сведений об ошибках
Приложения, написанные с помощью Microsoft Visual C++, могут получать от SQL Server Compact гораздо более подробные сведения по сравнению с HRESULT. Способ извлечения этих подробных сведений об ошибках зависит от метода, с помощью которого приложение взаимодействует с SQL Server Compact.
Объекты ошибок OLE DB
Поставщик OLE DB для SQL Server Compact возвращает большой набор объектов ошибок, доступный с помощью объектов ошибок OLE DB. В объектах ошибок OLE DB сохраняются ошибки различных уровней и дополнительные сведения, выходящие за рамки стандартных ошибок. Дополнительные сведения см. в разделе Использование объектов ошибок OLE DB (SQL Server Compact).
Объекты и коллекции обнаружения ошибок SQL Server Compact
Объекты Engine обнаруживают коллекции и параметры ошибок, к которым возможен доступ через Visual C++. Эти программы ссылаются на объекты и коллекции ошибок SQL Server, добавляя в проект файл sqlce_sync.h и ссылаясь на него директивой include. Дополнительные сведения см. в разделе Программирование собственного объекта ошибок (SQL Server Compact).
Использование собственных объектов и коллекций обнаружения ошибок
Коллекция SSCEErrors включает по одному объекту SSCEError на каждую сформированную ошибку. Каждый объект SSCEError содержит коллекцию SSCEParams. Описания ошибок можно получить из объектов SSCEParam в коллекции SSCEParams. SQL Server Compact, в отличие от SQL Server, возвращает подробные сведения об ошибке в виде коллекции из шести параметров. Создавая сообщения об ошибках, используйте серию вложенных циклов FOR для получения каждого объекта SSCEParam в коллекции SSCEParams для каждого объекта SSCEError.
Примеры
В следующем примере показано отображение ошибок объектов Engine с помощью Visual C++.
// 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)