Compartir a través de


Excepciones: Excepciones de base de datos

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.

Consulte también

Manejo de Excepciones