Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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 as classes MFC para ODBC (Open Database Connectivity) ou as classes MFC para Data Access Objects (DAO). O material específico de um ou outro modelo é explicitamente marcado. Os tópicos incluem:
Abordagens para o tratamento de exceções
A abordagem é a mesma se você estiver trabalhando com DAO (obsoleto) ou ODBC.
Você deve sempre escrever manipuladores de excepçã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 pela estrutura, que têm nomes do formulário AFX_SQL_ERROR_XXX, alguns CDBExceptions são baseados em códigos de retorno ODBC . Os códigos de retorno para tais exceções têm nomes do formulário SQL_ERROR_XXX.
Os códigos de retorno — definidos pela estrutura e pelo ODBC — que as classes de banco de dados podem retornar são documentados sob o m_nRetCode membro de dados 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 DAO
Para exceções 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 MFC DAO. Esses códigos de erro, que têm nomes do formato AFX_DAO_ERROR_XXX, estão documentados na secção do membro de dados em
CDaoException.m_scode contém um OLE SCODE da DAO, se aplicável. No entanto, raramente será necessário 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 os valores SCODE.
Informações adicionais sobre erros DAO, o tipo de objeto DAO Error e a coleção DAO Errors estão disponíveis na classe CDaoException.
Um exemplo de um 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 recordset (para uma fonte de dados ODBC). Para obter um exemplo semelhante para as classes DAO, consulte "Exemplo de exceção DAO" abaixo.
Exemplo de exceção ODBC
A função membro Open pode lançar uma exceção (do tipo CDBException para as classes ODBC), portanto, este código envolve a chamada Open com um bloco try. O bloco subsequente catch capturará um CDBException. Você pode examinar o próprio objeto de exceção, chamado e, mas, neste caso, basta saber que a tentativa de criar um conjunto de registros falhou. O catch bloco exibe uma caixa de mensagem e limpa excluindo o objeto do 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 DAO
O exemplo DAO é semelhante ao exemplo para 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 em busca de informações de erro. 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 seqüência de caracteres de mensagem de erro do membro m_pErrorInfo do objeto de exceção. MFC preenche este membro quando 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 Microsoft Jet (.mdb) e, na maioria dos casos, quando estiver trabalhando com ODBC, haverá apenas um objeto de erro. No caso raro em que você está usando uma fonte de dados ODBC e há vários erros, você pode percorrer a coleção Errors do DAO com base no número de erros retornados por CDaoException::GetErrorCount. A cada iteração do ciclo, chame CDaoException::GetErrorInfo para recarregar o membro de dados m_pErrorInfo.