Freigeben über


Ausnahmen: Datenbankausnahmen

In diesem Artikel wird erläutert, wie Datenbank exceptions behandelt werden. Die meisten Materialien in diesem Artikel gelten unabhängig davon, ob Sie mit den MFC-Klassen für Open Database Verbinden ivity (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 Ausnahmehandler schreiben, um außergewöhnliche Bedingungen 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. Überprüfen Sie dann die Ablaufverfolgungsausgabe, um zu sehen, welche Ausnahme ausgelöst wird, oder überprüfen 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

Neben vom Framework definierten Codes mit Namen des Formulars AFX_SQL_ERROR_XXX 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, die von den Datenbankklassen zurückgegeben werden können – sowohl von Framework als auch von ODBC definiert – werden unter dem m_nRetCode -Datenmember der CDBException-Klasse 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 Fehlerinformationen über drei Datenmember eines abgefangenen CDaoException-Objekts zugreifen:

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

  • m_nAfxDaoError enthält einen erweiterten Fehlercode aus den MFC DAO-Klassen. Diese Fehlercodes, die Namen des Formulars AFX_DAO_ERROR_XXX haben, werden unter dem Datenmememm in CDaoExceptiondokumentiert.

  • m_scode enthält ggf. einen OLE-SCODEaus DAO. Sie müssen jedoch selten mit diesem Fehlercode arbeiten. In der Regel sind weitere Informationen in den anderen beiden Datenmitgliedern verfügbar. Weitere Informationen zu SCODE-Werten finden Sie im Datenmemm.

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-Ausnahmebehandlung

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

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 Block in eckige try Klammern stellt. Der nachfolgende catch Block fangen eine CDBException. Sie können das Ausnahmeobjekt selbst untersuchen, das aufgerufen wird e, aber in diesem Fall reicht es aus, um zu wissen, dass der Versuch, ein Recordset zu erstellen, fehlgeschlagen ist. Der catch Block zeigt ein Meldungsfeld an und sauber durch Löschen des Recordset-Objekts.

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 Member des Ausnahmeobjekts ab. MFC füllt dieses Element aus, wenn er 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 durch die Schleife CDaoException::GetErrorInfo auf, um das m_pErrorInfo Datenelement erneut aufzufüllen.

Siehe auch

Ausnahmebehandlung