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 matériel dans cet article s'applique si vous utilisez les classes MFC pour l'ODBC (Open Database Connectivity) ou les classes MFC pour DAO (DAO).Le détail matériel à un ou un autre modèle est explicitement marqué.Les rubriques traitées ici sont les suivantes :

  • Approches liées à la gestion des exceptions

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

Approches liées à la gestion des exceptions

L'approche est le même que vous utilisez DAO ou ODBC.

Vous devez toujours écrire des gestionnaires d'exceptions des conditions exceptionnelles de handle.

L'approche la plus pragmatique aux exceptions interception de base de données est de tester votre application à des cas d'exception.Déterminez les exceptions possibles susceptibles de se produire pour une opération dans votre code, et forcer l'exception à générer.Examinez ensuite la sortie de trace voir quelle exception est levée, ou pour examiner les informations d'erreur retournés dans le débogueur.Cela vous permettent de savoir que les codes de retour vous ne verront pour les scénarios d'exception que vous utilisez.

19b8k939.collapse_all(fr-fr,VS.110).gifLes codes d'erreur utilisés pour les exceptions ODBC

En plus de les codes de retour définis par l'infrastructure, qui ont des noms du formulaire AFX_SQL_ERROR_XXX, un certain CDBExceptions sont basés sur les codes de retour d' ODBC .Codes de retour pour de telles exceptions ont des noms du formulaire SQL_ERROR_XXX.

Codes de retour — infrastructure-défini et ODBC-défini — que les classes de base de données peuvent retourner sont documentés dans le membre de données de m_nRetCode de la classe CDBException.Des informations supplémentaires à propos de les codes de retour définis par ODBC disponibles dans ODBC SDK Programmer's Reference dans MSDN Library.

19b8k939.collapse_all(fr-fr,VS.110).gifLes codes d'erreur utilisés pour les exceptions DAO

Pour les exceptions de DAO, plus d'informations sont généralement disponibles.Vous pouvez les informations d'erreur d'accès via trois données membres d'un objet intercepté de CDaoException :

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

  • m_nAfxDaoError contient un code d'erreur étendu les classes DAO MFC.Ces codes d'erreur, qui ont des noms du formulaire AFX_DAO_ERROR_XXX, sont documentés dans le membre de données dans CDaoException.

  • m_scode contient OLE SCODE DAO, le cas échéant.Vous devez rarement utiliser ce code d'erreur, toutefois.Habituellement plus d'informations sont disponibles dans les deux autres données membres.Consultez les données membres pour plus d'informations sur les valeurs d' SCODE .

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

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

Les exemple suivant tente de construire CRecordsetobjet dérivé sur le tas avec l'opérateur de new , puis d'ouvrir le recordset (pour une source de données ODBC).Pour obtenir un exemple similaire pour les classes DAO, consultez « exemple d'exception DAO » ci-dessous.

19b8k939.collapse_all(fr-fr,VS.110).gifExemple d'exception ODBC

La fonction membre d' Ouvrez peut lever une exception (de type CDBException pour les classes ODBC), les parenthèses de ce code l'appel de Ouvrir avec un bloc de try .Le bloc catch intercepte suivant CDBException.Vous pouvez passer en revue l'objet exception lui-même, eappelé, mais dans ce cas il est asse'de savoir que la tentative de création d'un recordset a échoué.Le bloc de catch affiche un 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;
}

19b8k939.collapse_all(fr-fr,VS.110).gifExemple d'exception DAO

L'exemple de DAO est similaire à l'exemple pour ODBC, mais vous pouvez généralement récupérer plus de genres d'informations.De code tente suivantes également d'ouvrir un recordset.Si cette tentative lève une exception, vous pouvez examiner une donnée membre de l'objet exception pour plus d'informations sur l'erreur.Comme dans l'exemple précédent ODBC, il est assez probablement 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 une chaîne de message d'erreur du membre de m_pErrorInfo de l'objet exception.MFC remplit ce membre lorsqu'il lève l'exception.

Pour une discussion des informations d'erreur retourné par un objet d' CDaoException , consultez aux 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 ne reste qu'un objet d'erreur.Dans les rares cas où vous utilisez une source de données ODBC et il y a plusieurs erreurs, vous pouvez parcourir la collection des erreurs de DAO en fonction de le nombre d'erreurs retournées par CDaoException::GetErrorCount.Chaque fois que via la boucle, appelez CDaoException::GetErrorInfo pour remplir les données membres d' m_pErrorInfo .

Voir aussi

Concepts

Gestion des exceptions dans MFC