Ausnahmen: Datenbankausnahmen
In diesem Artikel wird beschrieben, wie die Datenbank von Ausnahmen behandelt.Die meisten des Materials in diesem Artikel gilt, dass Sie mit den MFC-Klassen für ODBC (Open Database Connectivity) oder die MFC-Klassen für Datenzugriffsobjekte (DAO).Materielles oder einem anderen Modell auf bestimmte wird explizit gekennzeichnet.Folgende Themen werden behandelt:
Vorgehensweisen zur Ausnahmebehandlung
Ein Beispiel für eine ausnahmebehandlungs Datenbank
Vorgehensweisen zur Ausnahmebehandlung
Der Ansatz ist derselbe, unabhängig davon, ob Sie mit DAO oder ODBC verwenden.
Sie sollten Ausnahmehandler auf Ausnahmen Zuständen des Handles immer schreiben.
Der Ansatz zu pragmatischste Abfangen von Ausnahmen Datenbank besteht darin, die Anwendung mit Ausnahme Szenarios zu testen.Bestimmen Sie die möglichen Ausnahmen, die möglicherweise für einen Vorgang im Code auftreten können, und erzwingen Sie, dass die Ausnahme eintritt.Überprüfen Sie die Ausgabe, um zu ermitteln, welche Ausnahme ausgelöst wird oder die zurückgegebenen Fehlerinformationen im Debugger zu überprüfen.Dieses informiert Sie darüber, welche Szenarien für die Ausnahme Sie Rückgabecodes finden, die Sie verwenden.
Fehlercodes für ODBC-Ausnahmen
Neben den Rückgabecodes, die vom Framework, die den Namen des Formulars AFX_SQL_ERROR_XXX definiert haben, werden entweder CDBExceptions auf Grundlage ODBC Rückgabecodes.Die Rückgabecodes für solche Ausnahmen verfügen über Namen des Formulars SQL_ERROR_XXX.
Die Rückgabecodes — vom Framework definiert und ODBC-definiert, das die Datenbankklassen zurückgeben können, werden unter dem m_nRetCode Datenmember der Klasse CDBException dokumentiert.Zusätzliche Informationen über die Rückgabecodes, die von ODBC definiert sind, hat das ODBC SDK Programmer's Reference in der MSDN Library verfügbar.
Fehlercodes für DAO-Ausnahmen
Für DAO-Ausnahmen sind i. d. R. weitere Informationen verfügbar.Sie können Fehlerinformationen von drei Datenmember eines abgefangenen CDaoException-Objekts zugegriffen werden:
m_pErrorInfo enthält einen Zeiger auf einen CDaoErrorInfo-Objekt, das Fehlerinformationen in Auflistung von DAO Fehler Objekten gekapselt, die der Datenbank zugeordnet sind.
m_nAfxDaoError enthält einen erweiterten Fehlercode aus den MFC-DAO-Klassen.Diese Fehlercodes, die den Namen des Formulars AFX_DAO_ERROR_XXX haben, werden unter dem Datenmember in CDaoException dokumentiert.
m_scode enthält eine OLE SCODE von DAO, falls zutreffend.Sie müssen sich mit diesem Fehlercode, funktionieren jedoch.Normalerweise sind weitere Informationen in den anderen beiden Datenmember verfügbar.Siehe den Datenmember für weitere Informationen über SCODE-Werte.
Zusätzliche Informationen über DAO-Fehler, den DAO-Fehler objekttyp und die DAO-Fehlerauflistung wird unter CDaoException-Klasse verfügbar.
Ein Datenbank-Ausnahmebehandlungs-Beispiel
Im folgenden Beispiel wird versucht, CRecordset zu erstellenden abgeleitetes Objekt auf dem Heap mit dem new-Operator, und öffnen Sie dann das Recordset (bei einer ODBC-Datenquelle).Für ein Ähnliches Beispiel für die DAO-Klassen finden Sie unter "DAO-Ausnahme-Beispiel" weiter unten.
ODBC-Ausnahme-Beispiel
Die Öffnen-Memberfunktion kann eine Ausnahme (vom Typ CDBException für die ODBC-Klassen Klammern), sodass dieser Code auslösen der Öffnen Aufruf mit einem try-Block.Der folgende catch-Block fängt CDBException ab.Sie könnten das Ausnahmeobjekt selbst überprüfen, e aufgerufen, aber in diesem Fall ist es ausreichend, zu wissen, dass es sich bei dem Versuch, ein Recordset zu erstellenden fehlgeschlagen ist.Der catch-Block bereinigt und zeigt ein Meldungsfeld an, indem Sie das Recordset-Objekt auf Löschen.
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 ist z. B. für ODBC vergleichbar, aber Sie können mehrere Arten von Informationen in der Regel abrufen.Im folgenden Code wird außerdem ein Recordset zu öffnen.Wenn dieser Versuch, eine Ausnahme auslöst, können Sie einen Datenmember des Ausnahmeobjekts für Fehlerinformationen überprüfen.Wie im vorherigen ODBC-Beispiel, ist es häufig genug zu wissen, dass der fehlgeschlagenen Versuch, ein Recordset zu erstellen.
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 diesen Member aus, wenn die Ausnahme auslöst.
Eine Erläuterung der Fehlerinformationen, die von einem CDaoException-Objekt zurückgegeben werden, finden Sie CDaoException-Klassen und CDaoErrorInfo.
Wenn Sie mit Microsoft Jet-Datenbanken (.mdb) arbeiten und in den meisten Fällen, wenn Sie mit ODBC verwenden, gibt es nur ein Fehlerobjekt.Im seltenen Fall, wenn Sie eine ODBC-Datenquelle verwenden und mehrere Fehler auftreten, können Sie durch Fehlerauflistung DAO basierend auf der Anzahl der Fehler, die von einer CDaoException::GetErrorCount zurückgegeben werden.Jedes Mal, wenn durch die Schleife, rufen Sie CDaoException::GetErrorInfo auf, um den Datenmember m_pErrorInfo erneut zu füllen.