Výjimky: Výjimky databáze
Tento článek vysvětluje, jak zpracovávat výjimky databáze. Většina materiálů v tomto článku se vztahuje na to, zda pracujete s třídami MFC pro open database Připojení ivity (ODBC) nebo mfc třídy pro objekty datového přístupu (DAO). Materiál specifický pro jeden nebo druhý model je explicitně označen. Témata:
Přístupy ke zpracování výjimek
Přístup je stejný bez ohledu na to, jestli pracujete s rozhraním DAO (zastaralé) nebo rozhraním ODBC.
Vždy byste měli zapisovat obslužné rutiny výjimek pro zpracování výjimečných podmínek.
Nejběžnějším přístupem k zachycení výjimek databáze je otestování aplikace se scénáři výjimek. Určete pravděpodobné výjimky, ke kterým může dojít pro operaci v kódu, a vynuťte, aby k výjimce došlo. Pak prozkoumejte výstup trasování a zjistěte, jaká výjimka se vyvolá, nebo zkontrolujte vrácené informace o chybě v ladicím programu. To vám umožní zjistit, které návratové kódy uvidíte ve scénářích výjimek, které používáte.
Kódy chyb používané pro výjimky ODBC
Kromě návratových kódů definovaných rozhraním, které mají názvy formuláře AFX_SQL_ERROR_XXX, jsou některé definice CDBExceptions založené na návratových kódech ODBC . Návratové kódy pro takové výjimky mají názvy formuláře SQL_ERROR_XXX.
Návratové kódy – definované rozhraním i rozhraní ODBC – které mohou vracet databázové třídy, jsou zdokumentované v rámci m_nRetCode datového členu třídy CDBException
. Další informace o návratových kódech definovaných rozhraním ODBC jsou k dispozici v referenčních informacích programátora ODBC.
Kódy chyb používané pro výjimky DAO
U výjimek DAO jsou obvykle k dispozici další informace. K informacím o chybách můžete získat přístup prostřednictvím tří datových členů zachyceného objektu CDaoException :
m_pErrorInfo obsahuje ukazatel na objekt CDaoErrorInfo, který zapouzdřuje informace o chybách v kolekci objektů chyb přidružených k databázi daO.
m_nAfxDaoError obsahuje rozšířený kód chyby z tříd rozhraní MFC DAO. Tyto kódy chyb, které mají názvy formuláře AFX_DAO_ERROR_XXX, jsou zdokumentované pod datovým členem v
CDaoException
.m_scode obsahuje kód OLE SCODE z DAO, pokud je k dispozici. S tímto kódem chyby ale budete muset pracovat jen zřídka. Obvykle jsou k dispozici další informace v ostatních dvou datových členech. Další informace o hodnotách SCODE najdete v datovém členu.
Další informace o chybách DAO, typu objektu DAO Error a kolekci chyb DAO jsou k dispozici ve třídě CDaoException.
Příklad zpracování výjimek databáze
Následující příklad se pokusí sestavit CRecordset-odvozený objekt v haldě s new
operátorem a pak otevřít sadu záznamů (pro zdroj dat ODBC). Podobný příklad pro třídy DAO, viz "DAO Exception Example" níže.
Příklad výjimky ODBC
Členová funkce Open může vyvolat výjimku (typu CDBException pro třídy ODBC), takže tento kód závorky Open
volání s blokemtry
. Následující catch
blok zachytí CDBException
. Můžete prozkoumat samotný objekt výjimky, který se nazývá e
, ale v tomto případě stačí vědět, že pokus o vytvoření sady záznamů selhal. Blok catch
zobrazí okno se zprávou a vyčistí odstraněním objektu sady záznamů.
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;
}
Příklad výjimky DAO
Příklad rozhraní DAO je podobný příkladu rozhraní ODBC, ale obvykle můžete načíst další typy informací. Následující kód se také pokusí otevřít sadu záznamů. Pokud tento pokus vyvolá výjimku, můžete zkontrolovat datový člen objektu výjimky informace o chybě. Stejně jako v předchozím příkladu ROZHRANÍ ODBC pravděpodobně stačí vědět, že pokus o vytvoření sady záznamů selhal.
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;
}
Tento kód získá řetězec chybové zprávy z m_pErrorInfo člen objektu výjimky. MFC vyplní tento člen při vyvolání výjimky.
Diskuzi o chybě informace vrácené objektem CDaoException
naleznete třídy CDaoException a CDaoErrorInfo.
Při práci s databázemi Microsoft Jet (.mdb) a ve většině případů při práci s rozhraním ODBC bude pouze jeden objekt chyby. Ve výjimečných případech, kdy používáte zdroj dat ODBC a dochází k několika chybám, můžete procházet kolekci chyb DAO na základě počtu chyb vrácených atributem CDaoException::GetErrorCount. Pokaždé, když prochází smyčku, zavolejte CDaoException::GetErrorInfo k obnovení datového členu m_pErrorInfo
.