Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek vysvětluje, jak zpracovávat výjimky databáze. Většina materiálů v tomto článku se týká, zda pracujete s třídami MFC pro rozhraní ODBC (Open Database Connectivity) 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 je vyvolána, 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é architekturou i rozhraním ODBC – které mohou vracet databázové třídy, jsou zdokumentované v m_nRetCode datovém č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 chybových objektů DAO přidružených k databázi.
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 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 databáze Exception-Handling
Následující příklad se pokouší vytvořit objekt odvozený od CRecordset na haldě paměti pomocí operátoru new, a poté otevřít záznamovou sadu (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 obklopuje volání Open blokem try. 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, který obsahuje informace o chybě. Stejně jako v předchozím příkladu 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 člena m_pErrorInfo objektu výjimky. MFC vyplní tento člen při vyvolání výjimky.
Diskuzi o informacích o chybě, které vrátí objekt CDaoException, viz 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ž smyčka prochází, volá se CDaoException::GetErrorInfo k opětovnému naplnění datového členu m_pErrorInfo.