Freigeben über


Ausnahmen: Datenbank-Ausnahmen

Hinweis

Die Microsoft Foundation Classes (MFC)-Bibliothek wird weiterhin unterstützt. Wir fügen jedoch keine Features mehr hinzu oder aktualisieren die Dokumentation.

In diesem Artikel wird erläutert, wie Datenbankausnahmen behandelt werden. Die meisten Materialien in diesem Artikel gelten unabhängig davon, ob Sie mit den MFC-Klassen für Open Database Connectivity (ODBC) oder die MFC-Klassen für Data Access Objects (DAO) arbeiten. Material, das für ein oder das andere Modell spezifisch ist, wird explizit markiert. Dabei werden folgende Themen behandelt:

Ansätze für die Ausnahmebehandlung

Der Ansatz ist identisch, unabhängig davon, ob Sie mit DAO (veraltet) oder ODBC arbeiten.

Sie sollten immer Ausnahmebehandlungsroutinen schreiben, um Ausnahmebedingungen zu behandeln.

Der pragmatischste Ansatz zum Abfangen von Datenbank exceptions besteht darin, Ihre Anwendung mit Ausnahmeszenarien zu testen. Ermitteln Sie die wahrscheinlichen Ausnahmen, die für einen Vorgang im Code auftreten können, und erzwingen Sie, dass die Ausnahme auftritt. Untersuchen Sie dann die Tracing-Ausgabe, um zu sehen, welche Ausnahme ausgelöst wurde, oder untersuchen Sie die zurückgegebenen Fehlerinformationen im Debugger. Auf diese Weise erfahren Sie, welche Rückgabecodes für die von Ihnen verwendeten Ausnahmeszenarien angezeigt werden.

Für ODBC-Ausnahmen verwendete Fehlercodes

Zusätzlich zu den vom Framework definierten Rückgabecodes, die Namen in der Form von AFX_SQL_ERROR_XXX haben, basieren einige CDBExceptions auf ODBC-Rückgabecodes. Die Rückgabecodes für solche Ausnahmen weisen Namen des Formulars SQL_ERROR_XXX auf.

Die Rückgabecodes, sowohl von Framework als auch von ODBC definierte, die die Datenbankklassen zurückgeben können, werden unter dem m_nRetCode Datenelement der Klasse CDBException dokumentiert. Weitere Informationen zu von ODBC definierten Rückgabecodes finden Sie in der ODBC-Programmierreferenz.

Für DAO-Ausnahmen verwendete Fehlercodes

Für DAO-Ausnahmen sind in der Regel weitere Informationen verfügbar. Sie können auf die Fehlerinformationen über drei Data Member eines gefangenen CDaoException-Objekts zugreifen:

  • m_pErrorInfo enthält einen Zeiger auf ein CDaoErrorInfo-Objekt, das Fehlerinformationen in DAOs Sammlung von Fehlerobjekten kapselt, die der Datenbank zugeordnet sind.

  • m_nAfxDaoError enthält einen erweiterten Fehlercode aus den MFC DAO-Klassen. Diese Fehlercodes, die Namen in der Form AFX_DAO_ERROR_XXX haben, werden unter dem Datenmitglied in CDaoException dokumentiert.

  • m_scode enthält ggf. einen OLE-SCODE aus DAO. Sie müssen jedoch selten mit diesem Fehlercode arbeiten. In der Regel sind weitere Informationen in den anderen beiden Datenmitgliedern verfügbar. Im Data Member erfahren Sie mehr über SCODE-Werte.

Weitere Informationen zu DAO-Fehlern, dem DAO Error-Objekttyp und der DAO Errors-Auflistung finden Sie unter der Klasse CDaoException.

Beispiel für eine Datenbank Exception-Handling

Im folgenden Beispiel wird versucht, ein von CRecordset abgeleitetes Objekt auf dem Heap mit dem new-Operator zu erstellen und dann das Recordset (für eine ODBC-Datenquelle) zu öffnen. Ein ähnliches Beispiel für die DAO-Klassen finden Sie weiter unten unter "Beispiel für eine DAO-Ausnahme".

ODBC-Ausnahme (Beispiel)

Die Open-Memberfunktion könnte eine Ausnahme (vom Typ CDBException für die ODBC-Klassen) auslösen, sodass dieser Code den Open-Aufruf mit einem try-Block umschließt. Der nachfolgende catch-Block fängt eine CDBException ab. Sie könnten das Ausnahmeobjekt selbst untersuchen, genannt e, aber in diesem Fall reicht es zu wissen, dass der Versuch, ein Datensatz zu erstellen, fehlgeschlagen ist. Der catch-Block zeigt einen Bildschirm mit einer Nachricht an und löscht das Recordset-Objekt.

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

DAO-Ausnahme (Beispiel)

Das DAO-Beispiel ähnelt dem Beispiel für ODBC, Sie können jedoch in der Regel weitere Arten von Informationen abrufen. Der folgende Code versucht auch, ein Recordset zu öffnen. Wenn dieser Versuch eine Ausnahme auslöst, können Sie ein Datenelement des Ausnahmeobjekts auf Fehlerinformationen untersuchen. Wie im vorherigen ODBC-Beispiel reicht es wahrscheinlich aus, dass der Versuch, ein Recordset zu erstellen, fehlgeschlagen ist.

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

Dieser Code ruft eine Fehlermeldungszeichenfolge aus dem m_pErrorInfo Element des Ausnahmeobjekts ab. MFC füllt dieses Member, wenn es die Ausnahme auslöst.

Eine Erläuterung der von einem CDaoException Objekt zurückgegebenen Fehlerinformationen finden Sie unter klassen CDaoException und CDaoErrorInfo.

Wenn Sie mit Microsoft Jet-Datenbanken (.mdb) arbeiten und in den meisten Fällen, wenn Sie mit ODBC arbeiten, gibt es nur ein Fehlerobjekt. In dem seltenen Fall, wenn Sie eine ODBC-Datenquelle verwenden und mehrere Fehler auftreten, können Sie die Fehlerauflistung von DAO basierend auf der Anzahl der von CDaoException::GetErrorCount zurückgegebenen Fehler durchlaufen. Rufen Sie jedes Mal, wenn Sie die Schleife durchlaufen, CDaoException::GetErrorInfo auf, um das m_pErrorInfo-Data-Member wieder zu füllen.

Siehe auch

Ausnahmebehandlung