Compartilhar via


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

Observação

A biblioteca Microsoft Foundation Classes (MFC) continua sendo suportada. No entanto, não estamos mais adicionando recursos ou atualizando a documentação.

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 dos códigos de retorno definidos pelo framework, que têm nomes no formato 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, normalmente estão disponíveis mais informações. 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 no formato AFX_DAO_ERROR_XXX, são documentados na seção de membro de dados em CDaoException.

  • m_scode contém um OLE SCODE 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 elemento de dados para obter mais informações sobre os valores de 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 banco de dados Exception-Handling

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 encaixa a chamada Open com um bloco try. O bloco catch subsequente 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 de 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 da 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 raro caso em que você esteja usando uma fonte de dados ODBC e ocorram vários erros, você pode percorrer a coleção de Errors do DAO com base no número de erros retornados por CDaoException::GetErrorCount. A cada iteração do loop, chame CDaoException::GetErrorInfo para recarregar o membro de dados m_pErrorInfo.

Consulte também

Tratamento de Exceções