Exceptions : exceptions de base de données
Cet article explique comment gérer les exceptions de base de données. La plupart du matériel de cet article s’applique si vous travaillez avec les classes MFC pour Open Database Connecter ivity (ODBC) ou les classes MFC pour les objets DAO (Data Access Objects). Le matériau spécifique à un ou à l’autre modèle est explicitement marqué. Les sujets abordés sont les suivants :
Approches de gestion des exceptions
L’approche est la même que vous travaillez avec DAO (obsolète) ou ODBC.
Vous devez toujours écrire des gestionnaires d’exceptions pour gérer des conditions exceptionnelles.
L’approche la plus pragmatique pour intercepter des exceptions de base de données consiste à tester votre application avec des scénarios d’exception. Déterminez les exceptions susceptibles de se produire pour une opération dans votre code et forcez l’exception à se produire. Examinez ensuite la sortie de trace pour voir quelle exception est levée ou examinez les informations d’erreur retournées dans le débogueur. Cela vous permet de savoir quels codes de retour vous verrez pour les scénarios d’exception que vous utilisez.
Codes d’erreur utilisés pour les exceptions ODBC
En plus des codes de retour définis par l’infrastructure, qui ont des noms du formulaire AFX_SQL_ERROR_XXX, certaines CDBExceptions sont basées sur des codes de retour ODBC. Les codes de retour pour ces exceptions ont des noms de formulaire SQL_ERROR_XXX.
Les codes de retour ( définis par l’infrastructure et ODBC) que les classes de base de données peuvent retourner sont documentés sous le membre de données m_nRetCode de classe CDBException
. Des informations supplémentaires sur les codes de retour définis par ODBC sont disponibles dans la référence du programmeur ODBC.
Codes d’erreur utilisés pour les exceptions DAO
Pour les exceptions DAO, plus d’informations sont généralement disponibles. Vous pouvez accéder aux informations d’erreur via trois membres de données d’un objet CDaoException intercepté :
m_pErrorInfo contient un pointeur vers un objet CDaoErrorInfo qui encapsule les informations d’erreur dans la collection d’objets d’erreur associés à la base de données.
m_nAfxDaoError contient un code d’erreur étendu à partir des classes DAO MFC. Ces codes d’erreur, qui ont des noms du formulaire AFX_DAO_ERROR_XXX, sont documentés sous le membre de données dans
CDaoException
.m_scode contient un OLE SCODE de DAO, le cas échéant. Toutefois, vous devrez rarement utiliser ce code d’erreur. Généralement, plus d’informations sont disponibles dans les deux autres membres de données. Pour plus d’informations sur les valeurs SCODE , consultez le membre de données.
Des informations supplémentaires sur les erreurs DAO, le type d’objet DAO Error et la collection DAO Errors sont disponibles sous la classe CDaoException.
Exemple de gestion des exceptions de base de données
L’exemple suivant tente de construire un objet dérivé de CRecordset sur le tas avec l’opérateur new
, puis d’ouvrir le jeu d’enregistrements (pour une source de données ODBC). Pour obtenir un exemple similaire pour les classes DAO, consultez « Exemple d’exception DAO » ci-dessous.
Exemple d’exception ODBC
La fonction membre Open peut lever une exception (de type CDBException pour les classes ODBC), de sorte que ce code crochete l’appel Open
avec un try
bloc. Le bloc suivant catch
intercepte un CDBException
. Vous pouvez examiner l’objet d’exception lui-même, appelé e
, mais dans ce cas, il suffit de savoir que la tentative de création d’un jeu d’enregistrements a échoué. Le catch
bloc affiche une boîte de message et propre vers le haut en supprimant l’objet 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;
}
Exemple d’exception DAO
L’exemple DAO est similaire à l’exemple pour ODBC, mais vous pouvez généralement récupérer plus de types d’informations. Le code suivant tente également d’ouvrir un jeu d’enregistrements. Si cette tentative lève une exception, vous pouvez examiner un membre de données de l’objet d’exception pour obtenir des informations d’erreur. Comme avec l’exemple ODBC précédent, il est probablement suffisant de savoir que la tentative de création d’un jeu d’enregistrements a échoué.
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;
}
Ce code obtient une chaîne de message d’erreur à partir du membre m_pErrorInfo de l’objet d’exception. MFC remplit ce membre lorsqu’il lève l’exception.
Pour une discussion sur les informations d’erreur retournées par un CDaoException
objet, consultez les classes CDaoException et CDaoErrorInfo.
Lorsque vous utilisez des bases de données Microsoft Jet (.mdb) et, dans la plupart des cas, lorsque vous travaillez avec ODBC, il n’y a qu’un seul objet d’erreur. Dans le cas rare où vous utilisez une source de données ODBC et qu’il existe plusieurs erreurs, vous pouvez parcourir la collection Errors de DAO en fonction du nombre d’erreurs retournées par CDaoException ::GetErrorCount. Chaque fois dans la boucle, appelez CDaoException ::GetErrorInfo pour remplir le membre de m_pErrorInfo
données.