Compartilhar via


Exceções: exceções de banco de dados

Este artigo explica como lidar com exceções de banco de dados. A maior parte do material neste artigo se aplica se você está trabalhando com as classes MFC para ODBC (Open Database Connectivity) ou as classes MFC para DAO (Objetos de Acesso a Dados). O material específico para um ou outro modelo é marcado explicitamente. Os tópicos incluem:

Abordagens para tratamento de exceções

A abordagem é a mesma se você estiver trabalhando com DAO (obsoleto) ou ODBC.

Você sempre deve escrever manipuladores de exceção para lidar com condições excepcionais.

A abordagem mais pragmática para capturar exceções de banco de dados é testar seu aplicativo com cenários de exceção. Determine as exceções prováveis que podem ocorrer para uma operação em seu código e force a exceção a ocorrer. Em seguida, examine a saída de rastreamento para ver qual exceção é gerada ou examine as informações de erro retornadas no depurador. Isso permite que você saiba quais códigos de retorno você verá para os cenários de exceção que você está usando.

Códigos de erro usados para exceções ODBC

Além de retornar códigos definidos pela estrutura, que têm nomes do formulário AFX_SQL_ERROR_XXX, algumas CDBExceptions são baseadas em códigos de retorno ODBC . Os códigos retornados para essas exceções têm nomes do formulário SQL_ERROR_XXX.

Os códigos de retorno – definidos pela estrutura e definidos pelo ODBC – que as classes de banco de dados podem retornar são documentados no membro de dados m_nRetCode da classe CDBException. Informações adicionais sobre códigos de retorno definidos pelo ODBC estão disponíveis na Referência do Programador ODBC.

Códigos de erro usados para exceções de DAO

Para exceções de DAO, mais informações normalmente estão disponíveis. Você pode acessar informações de erro por meio de três membros de dados de um objeto CDaoException capturado:

  • m_pErrorInfo contém um ponteiro para um objeto CDaoErrorInfo que encapsula informações de erro na coleção de objetos de erro do DAO associados ao banco de dados.

  • m_nAfxDaoError contém um código de erro estendido das classes DAO do MFC. Esses códigos de erro, que têm nomes do formulário AFX_DAO_ERROR_XXX, são documentados no membro de dados em CDaoException.

  • m_scode contém um SCODE OLE do DAO, se aplicável. No entanto, você raramente precisará trabalhar com esse código de erro. Normalmente, mais informações estão disponíveis nos outros dois membros de dados. Consulte o membro de dados para obter mais informações sobre valores SCODE .

Informações adicionais sobre erros de DAO, o tipo de objeto de erro DAO e a coleção de erros da DAO estão disponíveis na classe CDaoException.

Um exemplo de Exception-Handling de banco de dados

O exemplo a seguir tenta construir um objeto derivado de CRecordset no heap com o new operador e, em seguida, abrir o conjunto de registros (para uma fonte de dados ODBC). Para obter um exemplo semelhante para as classes DAO, consulte "Exemplo de exceção da DAO" abaixo.

Exemplo de exceção ODBC

A função de membro Open pode gerar uma exceção (do tipo CDBException para as classes ODBC), portanto, esse código agrupa a Open chamada com um try bloco. O bloco subsequente catch capturará um CDBException. Você pode examinar o próprio objeto de exceção, chamado e, mas nesse caso é suficiente saber que a tentativa de criar um conjunto de registros falhou. O catch bloco exibe uma caixa de mensagem e limpa excluindo o objeto recordset.

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;
}

Exemplo de exceção da DAO

O exemplo de DAO é semelhante ao exemplo de ODBC, mas você normalmente pode recuperar mais tipos de informações. O código a seguir também tenta abrir um conjunto de registros. Se essa tentativa gerar uma exceção, você poderá examinar um membro de dados do objeto de exceção para obter informações de erro. Assim como no exemplo ODBC anterior, provavelmente é suficiente saber que a tentativa de criar um conjunto de registros falhou.

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;
}

Esse código obtém uma cadeia de caracteres de mensagem de erro do membro m_pErrorInfo do objeto de exceção. O MFC preenche esse membro quando ele lança a exceção.

Para obter uma discussão sobre as informações de erro retornadas por um CDaoException objeto, consulte as classes CDaoException e CDaoErrorInfo.

Quando você estiver trabalhando com bancos de dados do Microsoft Jet (.mdb) e, na maioria dos casos, quando estiver trabalhando com o ODBC, haverá apenas um objeto de erro. No caso raro quando você está usando uma fonte de dados ODBC e há vários erros, você pode executar um loop por meio da coleção Errors do DAO com base no número de erros retornados por CDaoException::GetErrorCount. Cada vez pelo loop, chame CDaoException::GetErrorInfo para recarregar o membro de m_pErrorInfo dados.

Consulte também

Tratamento de Exceções