Gestione degli errori nelle applicazioni native
Per le applicazioni sviluppate tramite Microsoft Visual C++ for Devices, è possibile ottenere informazioni sugli errori dal run-time dell'applicazione, dal provider di dati oppure utilizzando gli insiemi e gli oggetti di controllo degli errori ActiveX di Microsoft SQL Server Compact 3.5 (SQL Server Compact 3.5). L'utilizzo di insiemi e oggetti di controllo degli errori di SQL Server Compact 3.5 consente di gestire gli errori degli oggetti Replication, RemoteDataAccess ed Engine.
Recupero di informazioni sugli errori
Le applicazioni create con Microsoft Visual C++ for Devices possono ricevere da SQL Server Compact 3.5 informazioni molto più dettagliate rispetto a HRESULT. La modalità di recupero di queste informazioni estese sugli errori dipende da quale dei metodi descritti di seguito viene utilizzato dall'applicazione per l'interazione con SQL Server Compact 3.5.
- Oggetti errore OLE DB
Il provider OLE DB per SQL Server Compact 3.5 restituisce un set esteso di oggetti errore accessibile mediante oggetti errore OLE DB. Gli oggetti errore OLE DB contengono più livelli di errori e forniscono informazioni aggiuntive rispetto agli errori standard. Per ulteriori informazioni, vedere Utilizzo degli oggetti errore OLE DB (SQL Server Compact). - Oggetti e insiemi di controllo degli errori di SQL Server Compact 3.5
Gli oggetti Replication, RemoteDataAccess ed Engine offrono parametri e insiemi di errori accessibili tramite Visual C++. Questi programmi nativi fanno riferimento a oggetti errore e insiemi di errori di SQL Server aggiungendo sqlce_sync.h ai riferimenti di progetto e facendo riferimento a questi file mediante la direttiva include. Per ulteriori informazioni, vedere Programmazione dell'oggetto errore nativo (SQL Server Compact).
Utilizzo di insiemi e oggetti per il controllo degli errori nativi
L'insieme SSCEErrors contiene un oggetto SSCEError per ogni errore generato. In ogni oggetto SSCEError è presente un insieme SSCEParams. La descrizione degli errori può essere recuperata dagli oggetti SSCEParam dell'insieme SSCEParams. Diversamente da SQL Server, SQL Server Compact 3.5 restituisce informazioni dettagliate su un errore come insieme di sei parametri. Quando si creano messaggi di errore, utilizzare una serie di cicli FOR nidificati, in modo da recuperare tutti gli oggetti SSCEParam presenti nell'insieme SSCEParams per ogni oggetto SSCEError.
Esempi
Nell'esempio seguente viene illustrato come visualizzare gli errori degli oggetti Replication, RemoteDataAccess ed Engine utilizzando Visual C++ for Devices.
// 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;
}
Vedere anche
Altre risorse
Programmazione dell'oggetto errore nativo (SQL Server Compact)