Partager via


exceptions : exceptions de base de données

Cet article explique comment gérer les exceptions de base de données. La plupart du contenu dans cet article s'applique que vous utilisiez des classes de MFC pour Open Database Connectivity (ODBC) ou des classes de MFC pour DAO (DAO). Le contenu spécifique à un modèle ou à un autre est explicitement marqué. Les rubriques traitées ici sont les suivantes :

  • Approche pour la gestion des exceptions

  • Un exemple de gestion des exceptions de base de données

Approche pour la gestion des exceptions

La méthode est identique que vous utilisiez DAO ou ODBC.

Vous devez toujours écrire des gestionnaires d'exceptions pour gérer des conditions exceptionnelles.

L'approche la plus pragmatique pour saisir des exceptions base de données est de tester votre application avec des scénarios d'exception. Déterminez les exceptions potentielles susceptibles de se produire pour une opération dans votre code, et forcez l'exception à être générée. Puis examinez le résultat de trace pour afficher l'exception qui est levée, ou pour examiner les informations d'erreur retournées dans le débogueur. Ceci vous permet de savoir quels codes de retour vous verrez pour les scénarios d'exception utilisés.

Les codes d'erreur utilisés pour les exceptions ODBC

En plus des codes de retour définis par l'infrastructure, dont le nom du formulaire AFX_SQL_ERROR_XXX, plusieurs CDBExceptions sont basés sur les codes de retour d' ODBC. Les codes de retour pour de telles exceptions ont des noms de la forme SQL_ERROR_XXX.

Les codes de retour — à la fois définis par l'infrastructure et par l'ODBC — que les classes de base de données peuvent retourner sont décrits dans le membre de données de m_nRetCode de la classe CDBException. Des informations supplémentaires sur les codes de retour définis par ODBC sont disponibles dans le guide de référence du programmeur dans le SDK du ODBC de la librairie MSDN.

Les codes d'erreur utilisés pour les exceptions DAO

Pour les exceptions de DAO, des informations supplémentaires sont généralement disponibles. Vous pouvez accéder aux informations d'erreurs via trois membres de données d'un objet intercepté d' CDaoException:

  • m_pErrorInfo contient un pointeur vers un objet d' CDaoErrorInfo qui encapsule les informations d'erreur dans la collection de DAO d'objets d'erreur associés à la base de données.

  • m_nAfxDaoError contient le code d'erreur étendu des classes DAO MFC. Les codes d'erreur, dont le nom est de la forme AFX_DAO_ERROR_XXX, sont décrits dans le membre de données dans CDaoException.

  • m_scode contient un OLE SCODE du DAO, le cas échéant. Toutefois, vous devrez rarement travailler avec ce code d'erreur. Généralement plus d'informations sont disponibles dans les deux autres membres de données. Consultez le membre de données pour plus d'informations sur les valeurs d' SCODE.

Des informations supplémentaires sur les erreurs DAO, le type de l'objet d'erreur DAO, et la collection d'erreurs DAO sont disponibles dans la classe CDaoException.

Un exemple de gestion des exceptions de base de données

Les tentatives d'exemple suivantes de construire CRecordset- objet dérivé sur le segment à l'aide de l'opérateur de new, puis d'ouvrir l'ensemble d'enregistrements (pour une source de données ODBC). Pour un exemple similaire aux classes de DAO, consultez « Exemple d'exception de DAO » ci-dessous.

Exemple d'exception ODBC

La fonction membre d' Ouvrir peut lever une exception (de type CDBException pour les classes ODBC), donc ce code attache l'appel d' Ouvrir dans un bloc de Essayer. Le bloc attraper suivant interceptera un CDBException. Vous pouvez examiner l'objet d'exception lui-même, appelé e, mais dans ce cas il est suffisant de savoir que la tentative de création d'un recordset a échoué. Le bloc attraper affiche une boîte de message et nettoie 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 de DAO est similaire à l'exemple pour ODBC, mais vous pouvez généralement extraire plusieurs types d'informations. Le code suivant tente un recordset. Si cette tentative lève une exception, vous pouvez examiner un membre de données de l'objet exception pour plus d'informations sur l'erreur. Comme dans l'exemple précédent d'ODBC, il est probablement suffisant de savoir que la tentative de création d'un recordset 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 la chaîne de message d'erreur du membre d' m_pErrorInfo de l'objet exception. MFC remplit ce membre lorsqu'elle lève l'exception.

Pour obtenir des informations sur les erreurs retournées par un objet d' CDaoException, consultez les classes CDaoException et CDaoErrorInfo.

Lorsque vous utilisez des bases de données Microsoft Jet (fichier .mdb), et dans la plupart des cas lorsque vous utilisez ODBC, il n'y aura qu'un seul objet d'erreur. Dans le cas très peu fréquent lorsque vous utilisez une source de données ODBC et qu'il existe plusieurs erreurs, vous pouvez faire une boucle dans la collection d'erreurs de DAO selon le nombre d'erreurs retournées par CDaoException::GetErrorCount. Chaque fois que la boucle est complétée, appelez CDaoException::GetErrorInfo pour remplir le membre de données de m_pErrorInfo.

Voir aussi

Concepts

gestion des exceptions dans MFC