Exceções: Exceções de banco de dados
Este artigo explica como lidar com exceções de banco de dados.A maioria do material neste artigo se aplica se você estiver trabalhando com classes MFC para ODBC (em aberto banco de dados conectividade) ou as classes MFC para o dados acesso Objects (DAO).Material específico de um ou Outros modelo é marcado explicitamente.Os tópicos incluem:
Abordagens para a manipulação de exceção
Um exemplo de manipulação de exceção do banco de dados
Abordagens para a 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 exceções prováveis que podem ocorrer devido a uma operação em seu código e forçar a exceção ocorrer.Em seguida, examinar a saída do rastreamento para ver qual exceção é lançada, ou examinar as informações de erro retornado no depurador.Isso permite saber qual retornar códigos, que você verá nos cenários de exceção que você está usando.
Códigos de erro usados para exceções de ODBC
Além disso, para códigos de retorno definidos pela estrutura, que tem nomes do formulário AFX_SQL_ERROR_XXX, some 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 definidas pelo estrutura e pelo ODBC — que as classes de banco de dados podem retornar estão documentados no m_nRetCode membro de dados de classe CDBException. Informações adicionais sobre códigos de retorno definido pelo ODBC estão disponível no SDK do ODBC Referência do programador na biblioteca MSDN.
Códigos de erro usados para exceções de DAO
Para exceções de DAO, mais informações estão normalmente disponível.Você pode acessar informações de erro por meio de três dados membros de um identificada CDaoException objeto:
m_pErrorInfo contém um ponteiro para um CDaoErrorInfo objeto que encapsula as informações de erro do DAO coleção de objetos de erro associado ao banco de dados.
m_nAfxDaoError contém um código de erro estendidas das classes do MFC DAO.Esses códigos de erro têm nomes do formulário AFX_DAO_ERROR_XXX, estão documentados no membro de dados em CDaoException.
m_scode contém um OLE SCODE de DAO, se aplicável. Raramente será necessário trabalhar com código de erro, no entanto.Geralmente obter mais informações estão disponível em outros membros de dois dados.Consulte o membro de dados para obter mais informações sobre o SCODE valores.
Informações adicionais sobre erros DAO, o tipo de objeto de erro do DAO e a coleção DAO Errors estão disponível na classe CDaoException.
Um exemplo de manipulação de exceção do banco de dados
O exemplo a seguir tenta construir um CRecordset- derivada objeto no heap com o novo operador e abra o conjunto de registros (uma fonte de dados ODBC).Para obter um exemplo semelhante para as classes do DAO, consulte "DAO exemplo exceção" abaixo.
Exemplo de exceção do ODBC
The em aberto função de membro pode lançar uma exceção (do tipo CDBException para as classes ODBC), para que esse código colchetes o em aberto telefonar com um Tente bloco.O subseqüentescatch bloco irá capturar um CDBException. Você pode examinar o objeto de exceção, chamado e, mas nesse caso é suficiente saber que a tentativa de criar um conjunto de registros falhou. The catch bloco exibe uma caixa de mensagem e limpa, excluindo o 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;
}
Exemplo 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 em em aberto 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 sobre o erro.sistema autônomo no exemplo ODBC anterior, é provavelmente suficiente saber a 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;
}
Esse código obtém uma cadeia de caracteres da mensagem de erro do m_pErrorInfo membro do objeto de exceção.MFC preenche este membro quando lança a exceção.
Para obter informações sobre as informações de erro retornadas por um CDaoException objeto, consulte classes CDaoException and CDaoErrorInfo.
Quando você estiver trabalhando com bancos de dados Microsoft Jet (.mdb) e na maioria dos casos, quando você estiver trabalhando com ODBC, haverá apenas um objeto de erro.No caso raro quando você estiver usando uma fonte de dados ODBC e houver vários erros, você pode fazer loop através Errors coleção do DAO com base no número de erros retornados por CDaoException::GetErrorCount.Cada vez pelo loop, telefonar CDaoException::GetErrorInfo para reabastecer o m_pErrorInfo membro de dados.