Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se explica cómo controlar las excepciones de base de datos. La mayoría del material de este artículo se aplica si está trabajando con las clases MFC para la conectividad abierta de bases de datos (ODBC) o las clases MFC para objetos de acceso a datos (DAO). El material específico de uno u otro modelo se marca explícitamente. Contenido de los temas:
Enfoques para el control de excepciones
El enfoque es el mismo tanto si está trabajando con DAO (obsoleto) como con ODBC.
Siempre debe escribir controladores de excepciones para controlar condiciones excepcionales.
El enfoque más pragmático para detectar excepciones de base de datos es probar la aplicación con escenarios de excepción. Determine las excepciones probables que pueden producirse para una operación en el código y obligue a que se produzca la excepción. A continuación, examine la salida de seguimiento para ver qué excepción se produce o examine la información de error devuelta en el depurador. Esto le permite saber qué códigos de retorno verá para los escenarios de excepción que usa.
Códigos de error usados para excepciones ODBC
Además de los códigos de retorno definidos por el marco, que tienen nombres del formulario AFX_SQL_ERROR_XXX, algunas CDBExceptions se basan en códigos de retorno ODBC . Los códigos de retorno de estas excepciones tienen nombres del formulario SQL_ERROR_XXX.
Los códigos de retorno , definidos por el marco y definidos por ODBC, que las clases de base de datos pueden devolverse se documentan en el m_nRetCode miembro de datos de la clase CDBException
. Hay información adicional sobre los códigos de retorno definidos por ODBC en la Referencia del programador de ODBC.
Códigos de error usados para excepciones DAO
Para las excepciones de DAO, normalmente hay más información disponible. Puede acceder a la información de error a través de tres miembros de datos de un objeto CDaoException detectado:
m_pErrorInfo contiene un puntero a un objeto CDaoErrorInfo que encapsula la información de error en la colección de objetos de error de DAO asociados a la base de datos.
m_nAfxDaoError contiene un código de error extendido de las clases DAO de MFC. Estos códigos de error, que tienen nombres del formulario AFX_DAO_ERROR_XXX, se documentan en el miembro de datos de
CDaoException
.m_scode contiene un SCODE OLE de DAO, si procede. Sin embargo, rara vez tendrá que trabajar con este código de error. Normalmente hay más información disponible en los otros dos miembros de datos. Consulte el miembro de datos para obtener más información sobre los valores de SCODE .
Hay información adicional sobre los errores de DAO, el tipo de objeto Error de DAO y la colección Errors de DAO está disponible en la clase CDaoException.
Ejemplo de Exception-Handling de base de datos
En el ejemplo siguiente se intenta construir un objeto derivado de CRecordset en el montón con el new
operador y, a continuación, abrir el conjunto de registros (para un origen de datos ODBC). Para obtener un ejemplo similar para las clases DAO, vea "Ejemplo de excepción de DAO" a continuación.
Ejemplo de excepción ODBC
La función miembro Open podría producir una excepción (de tipo CDBException para las clases ODBC), por lo que este código entre corchetes la Open
llamada con un try
bloque. El bloque siguiente catch
detectará un CDBException
. Puede examinar el propio objeto de excepción, denominado e
, pero en este caso es suficiente saber que se ha producido un error en el intento de crear un conjunto de registros. El catch
bloque muestra un cuadro de mensaje y limpia eliminando el objeto del conjunto de registros.
CRecordset* CMyDatabaseDoc::GetRecordset()
{
CCourses* pSet = new CCourses(&m_dbCust);
try
{
pSet->Open();
}
catch (CDBException* e)
{
AfxMessageBox(e->m_strError, MB_ICONEXCLAMATION);
// Delete the incomplete recordset object
delete pSet;
pSet = NULL;
e->Delete();
}
return pSet;
}
Ejemplo de excepción de DAO
El ejemplo de DAO es similar al ejemplo de ODBC, pero normalmente puede recuperar más tipos de información. El código siguiente también intenta abrir un conjunto de registros. Si ese intento produce una excepción, puede examinar un miembro de datos del objeto de excepción para obtener información de error. Al igual que con el ejemplo anterior de ODBC, es probable que sea suficiente saber que se produjo un error en el intento de crear un conjunto de registros.
CDaoRecordset* CMyDaoDatabaseDoc::GetRecordset()
{
CDaoRecordset* pSet = new CCustSet(&m_db);
try
{
pSet->Open();
}
catch (CDaoException* pe)
{
AfxMessageBox(pe->m_pErrorInfo->m_strDescription, MB_ICONEXCLAMATION);
// Delete the incomplete recordset object
delete pSet;
pSet = NULL;
pe->Delete();
}
return pSet;
}
Este código obtiene una cadena de mensaje de error del miembro m_pErrorInfo del objeto de excepción. MFC rellena este miembro cuando produce la excepción.
Para obtener una explicación de la información de error devuelta por un CDaoException
objeto, vea las clases CDaoException y CDaoErrorInfo.
Cuando trabaje con bases de datos de Microsoft Jet (.mdb) y, en la mayoría de los casos, cuando trabaje con ODBC, solo habrá un objeto de error. En el caso poco frecuente cuando se usa un origen de datos ODBC y hay varios errores, puede recorrer en bucle la colección Errors de DAO en función del número de errores devueltos por CDaoException::GetErrorCount. Cada vez a través del bucle, llame a CDaoException::GetErrorInfo para rellenar el miembro de m_pErrorInfo
datos.