Compartilhar via


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

Este artigo explica como manipular exceções de banco de dados.A maioria do material neste artigo se aplica se você estiver trabalhando com as classes do MFC para Open Database Connectivity (ODBC) ou as classes MFC Data Access Objects (DAO).Material específico para um ou outro modelo é marcado explicitamente.Os tópicos incluem:

  • Abordagens para manipulação de exceção

  • Um exemplo de manipulação de exceção do banco de dados

Abordagens para manipulação de exceção

A abordagem é o mesmo se você estiver trabalhando com o DAO 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 prováveis exceções que podem ocorrer para uma operação em seu código e forçar a exceção ocorrer.Em seguida, examine a saída de rastreamento para ver qual exceção ou examinar as informações de erro retornado no depurador.Isso permite saber que você verá nos cenários de exceção que estão usando de códigos de retorno.

19b8k939.collapse_all(pt-br,VS.110).gifCódigos de erro usados para exceções de ODBC

Além das definidas pela estrutura de códigos de retorno, que ter nomes do formulário AFX_SQL_ERROR_XXX, alguns CDBExceptions baseados em ODBC códigos de retorno.Os códigos de retorno de tais exceções têm nomes do formulário SQL_ERROR_XXX.

Os códigos de retorno — tanto pelo framework e definidos pelo ODBC — que as classes de banco de dados podem retornar estão documentados na m_nRetCode membro de dados da classe CDBException.Informações adicionais sobre códigos de retorno definidos pelo ODBC estão disponíveis no SDK do ODBC referência do programador de em Biblioteca MSDN.

19b8k939.collapse_all(pt-br,VS.110).gifCódigos de erro usados para exceções DAO

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

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

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

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

Há informações adicionais sobre erros DAO, o tipo de objeto de erro do DAO e a coleção de erros do DAO em classe CDaoException.

Um exemplo de manipulação de exceção do banco de dados

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

19b8k939.collapse_all(pt-br,VS.110).gifExemplo de exceção ODBC

O Abrir função de membro poderia lançar uma exceção (do tipo CDBException para as classes ODBC), portanto, este código colchetes o Abrir chamar com um tente bloco.Subseqüente catch bloco irá capturar uma CDBException.Você poderia examinar o objeto de exceção, chamado e, mas neste caso é suficiente saber que falhou a tentativa de criar um conjunto de registros.O catch exibe uma caixa de bloco 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;
}

19b8k939.collapse_all(pt-br,VS.110).gifExemplo de exceção do DAO

O exemplo DAO é semelhante ao exemplo para ODBC, mas normalmente você pode recuperar mais tipos de informações.O código a seguir tenta abrir um conjunto de registros.Se essa tentativa lança uma exceção, você pode examinar um membro de dados do objeto de exceção para informações de erro.Como no exemplo anterior de ODBC, provavelmente é suficiente saber que houve falha na tentativa de criar um 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 obtém uma cadeia de caracteres de mensagem de erro do m_pErrorInfo membro do objeto de exceção.MFC preenche este membro quando lança a exceção.

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

Quando você estiver trabalhando com bancos de dados Microsoft Jet (. mdb) e, na maioria dos casos, quando você estiver trabalhando com ODBC, será apenas um objeto de erro.No caso raro quando você estiver usando uma fonte de dados ODBC e há vários erros, você pode fazer loop através da coleção de erros do DAO com base no número de erros retornados pelo CDaoException::GetErrorCount.Chamada de cada vez pelo loop, CDaoException::GetErrorInfo para reabastecer o m_pErrorInfo membro de dados.

Consulte também

Conceitos

Tratamento de exceção no MFC