Delen via


Uitzonderingen: Database-uitzonderingen

In dit artikel wordt uitgelegd hoe u database-uitzonderingen kunt verwerken. Het grootste deel van het materiaal in dit artikel is van toepassing of u werkt met de MFC-klassen voor Open Database Connectivity (ODBC) of de MFC-klassen voor Data Access Objects (DAO). Materiaal dat specifiek is voor een of het andere model, wordt expliciet gemarkeerd. Dit zijn een aantal van de onderwerpen:

Methoden voor het afhandelen van uitzonderingen

De methode is hetzelfde, ongeacht of u met DAO (verouderd) of ODBC werkt.

U moet altijd een uitzonderingshandler schrijven om uitzonderlijke omstandigheden af te handelen.

De meest pragmatische benadering voor het vangen van databaseuitzondering is het testen van uw toepassing met uitzonderingsscenario's. Bepaal de waarschijnlijke uitzonderingen die kunnen optreden voor een bewerking in uw code en dwing de uitzondering af. Bekijk vervolgens de traceringsuitvoer om te zien welke uitzondering wordt gegenereerd of bekijk de geretourneerde foutinformatie in het foutopsporingsprogramma. Hiermee weet u welke retourcodes u ziet voor de uitzonderingsscenario's die u gebruikt.

Foutcodes die worden gebruikt voor ODBC-uitzonderingen

Naast retourcodes die zijn gedefinieerd door het framework, met namen van de vorm AFX_SQL_ERROR_XXX, zijn sommige CDBExceptions gebaseerd op ODBC-retourcodes . De retourcodes voor dergelijke uitzonderingen hebben namen van het formulier SQL_ERROR_XXX.

De retourcodes ( zowel frameworkgedefinieerde als ODBC-gedefinieerde ) die de databaseklassen kunnen retourneren, worden gedocumenteerd onder het m_nRetCode gegevenslid van klasse CDBException. Aanvullende informatie over retourcodes die zijn gedefinieerd door ODBC, is beschikbaar in de ODBC-naslaginformatie voor programmeurs.

Foutcodes die worden gebruikt voor DAO-uitzonderingen

Voor DAO-uitzonderingen is doorgaans meer informatie beschikbaar. U kunt foutgegevens openen via drie gegevensleden van een gevangen CDaoException-object:

  • m_pErrorInfo bevat een aanwijzer naar een CDaoErrorInfo-object dat foutinformatie inkapselt in de verzameling foutobjecten van DAO die aan de database zijn gekoppeld.

  • m_nAfxDaoError bevat een uitgebreide foutcode uit de MFC DAO-klassen. Deze foutcodes, met namen van het formulier AFX_DAO_ERROR_XXX, worden beschreven onder het gegevenslid in CDaoException.

  • m_scode bevat een OLE SCODE van DAO, indien van toepassing. U hoeft echter zelden met deze foutcode te werken. Meestal is er meer informatie beschikbaar in de andere twee gegevensleden. Zie het gegevenslid voor meer informatie over SCODE-waarden .

Aanvullende informatie over DAO-fouten, het OBJECTtype DAO-fout en de verzameling DAO-fouten is beschikbaar onder klasse CDaoException.

Voorbeeld van een database Exception-Handling

In het volgende voorbeeld wordt geprobeerd een CRecordset-afgeleide object te maken op de heap met de new operator en vervolgens de recordset (voor een ODBC-gegevensbron) te openen. Zie 'DAO Exception Example' hieronder voor een vergelijkbaar voorbeeld voor de DAO-klassen.

Voorbeeld van ODBC-uitzondering

De Open functie kan een exceptie genereren (van het type CDBException voor de ODBC-klassen), dus deze code omcirkelt de Open aanroep met een try blok. Het volgende catch-blok vangt CDBException op. U kunt het uitzonderingsobject zelf onderzoeken, e maar in dit geval is het voldoende te weten dat de poging tot het maken van een recordset is mislukt. De catch block geeft een berichtvak weer en maakt schoon door het recordset-object te verwijderen.

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;
}

VOORBEELD VAN DAO-uitzondering

Het DAO-voorbeeld is vergelijkbaar met het voorbeeld voor ODBC, maar u kunt meestal meer soorten informatie ophalen. Met de volgende code wordt ook geprobeerd een recordset te openen. Als deze poging een uitzondering genereert, kunt u een gegevenslid van het uitzonderingsobject onderzoeken op foutinformatie. Net als bij het vorige ODBC-voorbeeld is het waarschijnlijk voldoende om te weten dat de poging om een recordset te maken is mislukt.

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;
}

Met deze code wordt een foutbericht weergegeven van het m_pErrorInfo lid van het uitzonderingsobject. MFC vult dit lid op wanneer de uitzondering wordt gegenereerd.

Zie de klassen CDaoException en CDaoErrorInfo voor een bespreking van de foutgegevens die door een object worden geretourneerd.

Wanneer u werkt met Microsoft Jet-databases (.mdb) en in de meeste gevallen wanneer u met ODBC werkt, is er slechts één foutobject. In het zeldzame geval wanneer u een ODBC-gegevensbron gebruikt en er meerdere fouten zijn, kunt u de verzameling fouten van DAO doorlopen op basis van het aantal fouten dat wordt geretourneerd door CDaoException::GetErrorCount. Telkens wanneer u de lus doorloopt, roept u CDaoException::GetErrorInfo aan om het m_pErrorInfo gegevenslid opnieuw in te vullen.

Zie ook

afhandeling van uitzonderingen