Ausnahmen: Datenbankausnahmen
Dieser Artikel beschreibt, wie Datenbankausnahmen behandelt. Die Großteil des Materials in diesem Artikel gilt, dass Sie mit MFC-Klassen für ODBC (Open Database Connectivity) oder MFC-Klassen für Datenzugriffsobjekte (DAO) arbeiten. Material Spezielle um einen oder anderen Modell wird explizit markiert. Folgende Themen werden behandelt:
Herangehensweisen für die Ausnahmebehandlung
Ein Datenbankausnahmebehandlungsbeispiel
Herangehensweisen für die Ausnahmebehandlung
Der Ansatz ist gleich, ob Sie mit DAO oder ODBC arbeiten.
Sie sollten zu den Ausnahmehandler außergewöhnlichen Zuständen des Handles immer schreiben.
Der pragmatischste Ansatz zu von Datenbankausnahmen ist, die Anwendung mit Ausnahmeszenarien zu testen. Bestimmen der wahrscheinlichen Ausnahmen, die möglicherweise für eine Operation im Code auftreten, und erzwingen Sie die Ausnahme, um zu fungieren. Untersuchen Sie dann die Ablaufverfolgungsausgabe, um anzuzeigen, welche Ausnahme ausgelöst wird, oder die Fehlerinformationen zurückgegebenen im Debugger zu überprüfen. Dieses informiert Sie, welche Rückgabecodes Sie für die Ausnahmeszenarien finden, die Sie verwenden.
Fehlercodes verwendet für ODBC-Ausnahmen
Neben den Rückgabecodes, die vom Framework, Namen des Formulars AFX_SQL_ERROR_XXX definiert sind, sind entweder CDBExceptions auf ODBC Rückgabecodes. Die Rückgabecodes für solche Ausnahmen über Namen des Formulars SQL_ERROR_XXX.
Die Rückgabecodes - vom Framework definiert und ODBC-definiert - dem die Datenbankklassen zurückgeben können, werden im m_nRetCode - Datenmember der Klasse CDBException dokumentiert. Zusätzliche Informationen zur Rückgabecodes, die mit ODBC definiert sind, ist in ODBC SDK Programmer's Reference in der MSDN Library verfügbar.
Fehlercodes verwendet für DAO-Ausnahmen
Für DAO-Ausnahmen sind weitere Informationen normalerweise verfügbar. Sie können Fehlerinformationen auf durch drei Datenmember eines abgefangenen CDaoException-Objekts zugreifen:
m_pErrorInfo enthält einen Zeiger auf ein CDaoErrorInfo, das in Fehlerobjekten Fehlerinformationen Auflistung DAO kapselt, die der Datenbank zugeordnet werden.
m_nAfxDaoError enthält einen erweiterten Fehlercode aus den MFC-DAO-Klassen. Diese Fehlercodes, Namen des Formulars AFX_DAO_ERROR_XXX haben, werden unter dem Datenmember in CDaoException dokumentiert.
m_scode enthält ein OLE SCODE von DAO, sofern zutreffend. Sie müssen selten mit diesem Fehlercode, funktionieren jedoch. Normalerweise sind weitere Informationen in den anderen zwei Datenmember verfügbar. Siehe den Datenmember für mehr über SCODE-Werte.
Zusätzliche Informationen über DAO-Fehler, den DAO-Fehlerobjekttyp und die DAO-Fehlerauflistung unterliegt Klasse CDaoException verfügbar.
Ein Datenbank-Ausnahmebehandlungs-Beispiel
Im folgenden Beispiel versucht, Erstellen CRecordset abgeleitetes Objekt auf dem Heap mit dem Operator neu, und Recordset dann zu öffnen (für eine ODBC-Datenquelle.) Ein Ähnliches Beispiel für die DAO-Klassen, finden Sie unter "DAO-Ausnahme-Beispiel" unten.
ODBC-Ausnahme-Beispiel
Die Memberfunktion Öffnen kann eine Ausnahme des Typs CDBException (für die ODBC-Klassen), d Klammern diesem Code auslösen der Öffnen Aufruf mit einem try-Block. Der folgenden catch-Block fängt CDBException ab. Sie könnten das Ausnahmeobjekt selbst überprüfen, e, jedoch ist es in diesem Fall ausreichend, zu wissen, dass der Test, ein Recordset erstellen fehlgeschlagen ist. Der catch-Block wird ein Meldungsfeld angezeigt und bereinigt, indem das Recordset-Objekt löscht.
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 beispielsweise für ODBC vergleichbar, jedoch können Sie weitere Arten von Informationen in der Regel ab. Der folgenden Code versucht auch, ein Recordset öffnen. Wenn dieser Versuch eine Ausnahme auslöst, einen Datenmember des Ausnahmeobjekts für Fehlerinformationen überprüfen. Wie im vorherigen ODBC-Beispiel, ist es wahrscheinlich genug, zu wissen, dass der Test, ein Recordset erstellen konnte.
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 vom m_pErrorInfo-Member des Ausnahmeobjekts ab. MFC füllt diesen Member aus, wenn die Ausnahme auslöst.
Eine Erörterung die Fehlerinformationen, die durch ein CDaoException-Objekt zurückgegeben werden, finden Sie Klassen CDaoException und CDaoErrorInfo.
Wenn Sie mit Microsoft Jet-Datenbanken (.mdb) arbeiten und den meisten Fällen, wenn Sie mit ODBC arbeiten, ist nur ein Fehlerobjekts. Im seltenen Fall, wenn Sie eine ODBC-Datenquelle verwenden und mehrere Fehler auftreten, können Sie durch Fehlerauflistung DAO auf Grundlage der Anzahl von Fehlern durchlaufen, die von CDaoException::GetErrorCount zurückgegeben werden. Jedes Mal wenn von der Schleife, rufen Sie CDaoException::GetErrorInfo, um den m_pErrorInfo Datenmembers erneut zu füllen.