Share via


Excepciones: Excepciones de base de datos

En este artículo se explica cómo controlar excepciones de base de datos.La mayor parte del material en este artículo se aplica si trabaja con las clases MFC para ODBC o clases MFC para Objetos de acceso a datos (DAO).El concreto material a un u otro modelo se marca explícitamente.Entre los temas se incluyen los siguientes:

  • Enfoques al control de excepciones

  • Un ejemplo de control de excepciones de base de datos

Enfoques al control de excepciones

El enfoque es el mismo si trabaja con DAO u ODBC.

Debe escribir siempre los controladores de excepciones a las condiciones excepcionales ID.

El enfoque más a pragmatic detectar excepciones de base de datos es probar su aplicación con escenarios de la excepción.Determine las excepciones probable que podrían aparecer para una operación en el código, y fuerza la excepción aparezca.A continuación examine el resultado de traza para ver se produce la excepción, o para examinar la información de error devuelta en el depurador.Esto le permite saber que los códigos devueltos se consideren para escenarios de excepción que está utilizando.

19b8k939.collapse_all(es-es,VS.110).gifCódigos de error utilizados para ODBC Excepciones

Además de los códigos devueltos definido por el marco, que tienen nombres de formulario AFX_SQL_ERROR_XXX, algún CDBExceptions se basa en los códigos de retorno de ODBC .Los códigos de retorno para esas excepciones tienen nombres de formulario SQL_ERROR_XXX.

Los códigos de retorno — inicio y ODBC-definido — que las clases de base de datos pueden devolver se documentan en miembro de datos de m_nRetCode de la clase CDBException.Información adicional sobre los códigos de retorno definido por ODBC está disponible en la referencia de ODBC en el CD de MSDN Library.

19b8k939.collapse_all(es-es,VS.110).gifCódigos de error utilizados para DAO Excepciones

Para las excepciones de DAO, más información es normalmente disponibles.Puede tener acceso a la información de error a través de tres miembros de datos de un objeto detectado de CDaoException :

  • m_pErrorInfo contiene un puntero a un objeto de CDaoErrorInfo que encapsula información de error en la colección de DAO de objetos error asociado 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 de formulario AFX_DAO_ERROR_XXX, se documentan en miembro de datos en CDaoException.

  • m_scode contiene SCODE OLE de DAO, si es necesario.Necesitará raramente ejecutar este código de error, sin embargo.Más información suele ser disponibles en los otros dos miembros de datos.Vea el miembro de datos para más información sobre los valores de SCODE .

Información adicional sobre los errores de DAO, el tipo de objeto del error de DAO, y la colección de errores de DAO está disponible bajo la clase CDaoException.

Un ejemplo de control de excepciones de base de datos

El ejemplo siguiente se intenta construir CRecordset- objeto derivado en la pila con el operador de new , y abrir el conjunto de registros (para un origen de datos ODBC).Para obtener un ejemplo similar para las clases DAO, vea el “ejemplo de DAO Exception”.

19b8k939.collapse_all(es-es,VS.110).gifEjemplo de excepción de ODBC

La función miembro de Abrir podría producir una excepción (de CDBException con tipo para las clases ODBC), por lo que los corchetes de este código la llamada de Abrir con un bloque de try .El bloque catch posterior detectará CDBException.Puede examinar el objeto de excepción propio, denominado e, pero en este caso es bastante saber que se ha producido un error en el intento de crear un conjunto de registros.El bloque de 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;
}

19b8k939.collapse_all(es-es,VS.110).gifEjemplo de excepción de DAO

El ejemplo de DAO es similar al ejemplo de ODBC, pero puede recuperar normalmente a varios tipos de información.El código siguiente también intenta abrir un conjunto de registros.Si ese intento produce una excepción, puede ir a un miembro de datos del objeto de excepción para la información de error.Como en el ejemplo anterior de ODBC, es 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 de miembro de m_pErrorInfo del objeto de excepción.MFC rellena este miembro cuando produce la excepción.

Para obtener una descripción de la información de error devuelta por un objeto de CDaoException , vea las clases CDaoException y CDaoErrorInfo.

Cuando trabaja con bases de datos de Microsoft Jet (.mdb) y, en la mayoría de los casos cuando se trabaja con ODBC, habrá sólo un objeto error.En el caso poco frecuente cuando se utiliza un origen de datos ODBC y hay varios errores, puede recorrer en iteración la colección de errores de DAO basándose en el número de errores devueltos por CDaoException::GetErrorCount.Cada vez que a través del bucle, llamada CDaoException::GetErrorInfo para rellenar el miembro de datos de m_pErrorInfo .

Vea también

Conceptos

Control de excepciones en MFC