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 si está trabajando con DAO (obsoleto) o 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 está usando.

Códigos de error usados para excepciones ODBC

Además de los códigos de retorno definidos por el marco de trabajo, 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 devolver están documentados en el miembro de datos m_nRetCode de la clase CDBException. Encontrará 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 capturado:

  • 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.

Encontrará 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 control de excepciones de base de datos

En el ejemplo siguiente se intenta construir un objeto derivado de CRecordset en el montón con el operador new 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 corchete la llamada a Open con un bloque try. El bloque catch subsiguiente detectará un objeto 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 bloque catch muestra un cuadro de mensaje y limpia eliminando el objeto de 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 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 inicia la excepción.

Para obtener una explicación de la información de error devuelta por un objeto CDaoException, 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 que pase el bucle, llame a CDaoException::GetErrorInfo para rellenar el miembro de datos m_pErrorInfo.

Consulte también

Control de excepciones