Wyjątki: wyjątki bazy danych
W tym artykule wyjaśniono, jak obsługiwać wyjątki bazy danych. Większość materiałów w tym artykule ma zastosowanie do tego, czy pracujesz z klasami MFC dla open database Połączenie ivity (ODBC) lub klas MFC dla obiektów dostępu do danych (DAO). Materiał specyficzny dla jednego lub drugiego modelu jest jawnie oznaczony. Tematy obejmują:
Podejścia do obsługi wyjątków
Podejście to jest takie samo, czy pracujesz z dao (przestarzałe) czy ODBC.
W celu obsługi wyjątkowych warunków należy zawsze zapisywać programy obsługi wyjątków.
Najbardziej pragmatyczne podejście do przechwytywania wyjątków bazy danych polega na przetestowaniu aplikacji przy użyciu scenariuszy wyjątków. Ustal prawdopodobne wyjątki, które mogą wystąpić dla operacji w kodzie, i wymuś wystąpienie wyjątku. Następnie sprawdź dane wyjściowe śledzenia, aby zobaczyć, jaki wyjątek jest zgłaszany, lub sprawdź zwrócone informacje o błędzie w debugerze. Dzięki temu możesz dowiedzieć się, które kody powrotne będą widoczne w scenariuszach wyjątków, których używasz.
Kody błędów używane dla wyjątków ODBC
Oprócz kodów zwracanych zdefiniowanych przez platformę, które mają nazwy formularza AFX_SQL_ERROR_XXX, niektóre kody powrotne CDBExceptions są oparte na kodach powrotnych ODBC. Kody powrotne dla takich wyjątków mają nazwy SQL_ERROR_XXX formularza.
Kody powrotne — zdefiniowane zarówno przez platformę, jak i zdefiniowane przez ODBC — które klasy baz danych mogą zwracać, są udokumentowane w m_nRetCode składowej danych klasy CDBException
. Dodatkowe informacje na temat kodów zwrotnych zdefiniowanych przez ODBC są dostępne w dokumentacji programisty ODBC.
Kody błędów używane dla wyjątków DAO
W przypadku wyjątków DAO więcej informacji jest zwykle dostępnych. Dostęp do informacji o błędzie można uzyskać za pośrednictwem trzech elementów członkowskich danych przechwyconego obiektu CDaoException :
m_pErrorInfo zawiera wskaźnik do obiektu CDaoErrorInfo, który hermetyzuje informacje o błędzie w kolekcji obiektów błędów skojarzonych z bazą danych dao.
m_nAfxDaoError zawiera rozszerzony kod błędu z klas MFC DAO. Te kody błędów, które mają nazwy formularza AFX_DAO_ERROR_XXX, są udokumentowane w elemencie członkowskim danych w programie
CDaoException
.m_scode zawiera obiekt OLE SCODE z daO, jeśli ma to zastosowanie. Jednak rzadko trzeba pracować z tym kodem błędu. Zazwyczaj więcej informacji jest dostępnych w dwóch pozostałych elementach członkowskich danych. Zobacz element członkowski danych, aby uzyskać więcej informacji na temat wartości SCODE .
Dodatkowe informacje o błędach dao, typ obiektu błędu DAO i kolekcja Błędów DAO jest dostępna w klasie CDaoException.
Przykład obsługi wyjątków bazy danych
Poniższy przykład próbuje skonstruować obiekt pochodny CRecordset na stercie za pomocą new
operatora, a następnie otworzyć zestaw rekordów (dla źródła danych ODBC). Podobny przykład dla klas DAO można znaleźć w poniższym przykładzie "Przykład wyjątku DAO".
Przykład wyjątku ODBC
Funkcja Open member może zgłosić wyjątek (typ CDBException dla klas ODBC), więc ten kod tworzy nawiasy Open
wywołania z blokiem try
. Kolejny catch
blok przechwyci element CDBException
. Można zbadać sam obiekt wyjątku o nazwie e
, ale w tym przypadku wystarczy wiedzieć, że próba utworzenia zestawu rekordów nie powiodła się. Blok catch
wyświetla pole komunikatu i czyści, usuwając obiekt zestawu rekordów.
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;
}
Przykład wyjątku DAO
Przykład daO jest podobny do przykładu odBC, ale zazwyczaj można pobrać więcej rodzajów informacji. Poniższy kod próbuje również otworzyć zestaw rekordów. Jeśli ta próba zgłosi wyjątek, możesz zbadać element członkowski danych obiektu wyjątku pod kątem informacji o błędzie. Podobnie jak w poprzednim przykładzie ODBC, prawdopodobnie wystarczy wiedzieć, że próba utworzenia zestawu rekordów nie powiodła się.
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;
}
Ten kod pobiera ciąg komunikatu o błędzie z m_pErrorInfo elementu członkowskiego obiektu wyjątku. MFC wypełnia ten element członkowski, gdy zgłasza wyjątek.
Aby zapoznać się z omówieniem informacji o błędzie zwracanych przez CDaoException
obiekt, zobacz klasy CDaoException i CDaoErrorInfo.
Podczas pracy z bazami danych microsoft Jet (mdb) i w większości przypadków podczas pracy z ODBC wystąpi tylko jeden obiekt błędu. W rzadkich przypadkach, gdy używasz źródła danych ODBC i występuje wiele błędów, możesz przeprowadzić pętlę za pośrednictwem kolekcji Błędy obiektu DAO na podstawie liczby błędów zwracanych przez CDaoException::GetErrorCount. Za każdym razem za pomocą pętli wywołaj metodę CDaoException::GetErrorInfo , aby uzupełnić m_pErrorInfo
składową danych.