Control de errores en las aplicaciones nativas
En el caso de las aplicaciones desarrolladas con Microsoft Visual C++ for Devices, la información de errores puede obtenerse a partir del tiempo de ejecución de la aplicación, del proveedor de datos o mediante las colecciones y los objetos de control de errores ActiveX de Microsoft SQL Server Compact 3.5 (SQL Server Compact 3.5). El uso de las colecciones y los objetos de control de errores de SQL Server Compact 3.5 constituye el método para controlar los errores de los objetos Replication, RemoteDataAccess y Engine.
Recuperación de información sobre errores
Las aplicaciones escritas con Microsoft Visual C++ for Devices pueden recibir mucha más información detallada de SQL Server Compact 3.5 que HRESULT. La forma de recuperar de esta información de errores ampliada depende del método (de los que se muestran a continuación) que usa la aplicación para interactuar con SQL Server Compact 3.5:
- Objetos de error OLE DB
El proveedor OLE DB para SQL Server Compact 3.5 devuelve un conjunto de objetos de error completo al cual se puede obtener acceso mediante objetos de error de OLE DB. Los objetos de error OLE DB almacenan varios niveles de errores y proporcionan información adicional a la de los errores estándar. Para obtener más información, vea Usar los objetos de error de OLE DB (SQL Server Compact). - Colecciones y objetos de control de errores de SQL Server Compact 3.5
Los objetos Replication, RemoteDataAccess y Engine revelan colecciones y parámetros de error a los que se puede obtener acceso mediante Visual C++. Estos programas nativos hacen referencia a las colecciones y los objetos de error de SQL Server agregando sqlce_sync.hto a las referencias del proyecto y haciendo referencia a estos archivos con la directiva include.Para obtener más información, vea Programar el objeto Native Error (SQL Server Compact).
Usar los objetos y colecciones de control de errores nativos
La colección SSCEErrors contiene un objeto SSCEError por cada error generado. Cada objeto SSCEError contiene una colección SSCEParams. La descripción de los errores se puede recuperar en los objetos SSCEParam de la colección SSCEParams. A diferencia de SQL Server, SQL Server Compact 3.5 devuelve información detallada acerca de un error en forma de colección de seis parámetros. Al crear mensajes de error, use una serie de bucles FOR anidados para recuperar cada objeto SSCEParam de la colección SSCEParams de cada objeto SSCEError.
Ejemplos
El ejemplo siguiente ilustra cómo mostrar los errores de los objetos Replication, RemoteDataAccess y Engine mediante 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;
}
Vea también
Otros recursos
Programar el objeto Native Error (SQL Server Compact)