Exceções: exceções de banco de dados
Este artigo explica como tratar exceções da base de dados. A maioria do hardware neste artigo se aplicará se você estiver trabalhando com as classes de MFC do ODBC ou as classes de MFC para objetos (DAO) de acesso a dados. O hardware específico a um ou outro modelo é marcado explicitamente. Os tópicos incluem:
Abordagens para a manipulação de exceção
Um exemplo de manipulação de exceções gerais da base de dados
Abordagens para a manipulação de exceção
A abordagem é a mesma se você estiver trabalhando com DAO ou ODBC.
Você sempre deve escrever manipuladores de exceção às condições excepcionais do identificador.
A abordagem mais pragmática a capturar exceções da base de dados é testar seu aplicativo com cenários de exceção. Determina as exceções provável que podem ocorrer para uma operação em seu código, e para forçar a exceção ocorrer. Examine a saída de rastreamento para consultar exceção que é lançada, ou para revisar informações de erro retornado no depurador. Isso permite saber que códigos de retorno você consultará os cenários de exceção que você está usando.
Códigos de erro ODBC usados para exceções
Além dos códigos de retorno definidos pela estrutura, que tenham nomes do formulário AFX_SQL_ERROR_XXX, qualquer CDBExceptions é baseado 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 — vezes definido e — definida com que o base de dados de classificação podem retornar são documentados no membro de dados de m_nRetCode da classe CDBException. Informações adicionais sobre os códigos de retorno definidas pelo ODBC está disponível em Referência do Programador do ODBC SDK na Biblioteca MSDN.
Códigos de erro usados para exceções de DAO
Para exceções de DAO, mais informações geralmente está disponível. Você pode informações de erro de acesso por meio de três membros de dados de um objeto capturado de CDaoException :
m_pErrorInfo contém um ponteiro para um objeto de CDaoErrorInfo que encapsula as informações de erro na coleção de DAO de objetos de erro associadas com o base de dados.
m_nAfxDaoError contém um código de erro estendidas de classes de MFC DAO. Esses códigos de erro, que tenham nomes do formulário AFX_DAO_ERROR_XXX, são documentados no membro de dados em CDaoException.
m_scode contém SCODE OLE de DAO, se aplicável. Você precisará raramente de trabalhar com esse código de erro, porém. Geralmente mais informações estão disponíveis em outros dois membros de dados. Consulte o membro de dados para obter mais informações sobre valores de SCODE .
Informações adicionais sobre erros de DAO, o tipo de objeto do erro de DAO, e a coleção de erros de DAO está disponível sob a classe CDaoException.
Um exemplo de manipulação de exceções gerais da base de dados
O exemplo a seguir tenta criar CRecordset- objeto derivada no heap com o operador de new , e abra o conjunto de registros (para uma fonte de dados ODBC). Para obter um exemplo semelhante para classes de DAO, consulte “o exemplo de exceção DAO” em.
Exemplo de exceção ODBC
A função de membro de Abrir pode gerar uma exceção (do tipo CDBException para classes de ODBC), de forma que os colchetes desse código a chamada de Abrir com um bloco de try . O bloco subsequente de catch detectará CDBException. Você pode examinar o próprio objeto de exceção, echamado, mas nesse caso é suficiente para saber quais a tentativa de criar um conjunto de registros falhou. O bloco de catch exibe uma caixa de mensagem e limpa-a 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 de DAO
O exemplo de DAO é semelhante ao exemplo para ODBC, mas você pode recuperar normalmente mais tipos de informações. O código a seguir também tenta abrir um conjunto de registros. Se essa tentativa gerou uma exceção, você pode examinar um membro de dados do objeto de exceção para as informações de erro. Como no exemplo anterior ODBC, provavelmente o suficiente para saber quais 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 de m_pErrorInfo do objeto de exceção. MFC O preenche esse membro quando gerou a exceção.
Para obter uma descrição das informações de erro retornado por um objeto de CDaoException , consulte a CDaoException classes e CDaoErrorInfo.
Quando você estiver trabalhando com bases de dados do Microsoft Jet (.mdb) e, na maioria dos casos quando você estiver trabalhando com ODBC, haverá apenas um objeto do erro. Em casos raros quando você estiver usando uma fonte de dados ODBC e houver vários erros, você pode criar um loop através da coleção de erros de DAO com base no número de erros retornados por CDaoException::GetErrorCount. Cada vez que pelo loop, chame CDaoException::GetErrorInfo para preencher novamente o membro de dados de m_pErrorInfo .