Wyjątki: Wyjątki bazy danych
W tym artykule wyjaśniono sposób obsługi wyjątków bazy danych.Większość materiału w niniejszym artykule stosuje się, czy pracujesz z klas MFC Open Database Connectivity (ODBC) lub klas MFC dla obiektów DAO (Data Access).Jeden lub drugi model materiał jest jawnie oznaczony jako.Tematy obejmują:
Podejścia do obsługi wyjątków
Przykład obsługi wyjątków bazy danych
Podejścia do obsługi wyjątków
Podejście jest taka sama, czy pracujesz z DAO lub ODBC.
Zawsze należy wpisać procedur obsługi wyjątków, wyjątkowych warunkach obsługi.
Jest najbardziej pragmatyczne podejście do połowu wyjątki bazy danych do testowania aplikacji, z wyjątkiem scenariuszy.Określić prawdopodobieństwo wyjątków, które mogą wystąpić dla operacji w kodzie i wymusić wyjątek występuje.Przeanalizuj wyjście śledzenia, aby zobaczyć, jakie wyjątek lub bada informacje zwrócony błąd w debugerze.To pozwala dowiedzieć się, który zwraca kody zobaczysz scenariuszy wyjątek, używany.
Kody błędów używane dla wyjątków ODBC
Oprócz kodów powrotu określone w ramach, które mają nazwy formularza AFX_SQL_ERROR_XXX, niektóre CDBExceptions na podstawie ODBC kody zwracane.Kody powrotu takich wyjątków mają nazwy formularza SQL_ERROR_XXX.
Kody zwrotne — zarówno zdefiniowanych w ramach, jak i zdefiniowane przez ODBC — klas bazy danych można powrócić, są udokumentowane w m_nRetCode danych członka klasy CDBException.Dodatkowe informacje o kody zwrotne definiowane przez ODBC jest dostępny w zestawie SDK ODBC Programmer's Reference w bibliotece MSDN.
Kody błędów używane dla obiektów DAO wyjątków
Wyjątki DAO zazwyczaj dostępne jest więcej informacji.Informacje o błędzie można dostępu za pomocą danych z trzech członków złowione CDaoException obiekt:
m_pErrorInfo zawiera wskaźnik do CDaoErrorInfo obiekt, który mieści się informacje o błędach w kolekcji obiektów DAO w błąd obiektów bazy danych.
m_nAfxDaoError zawiera kod błędu rozszerzonego klas MFC DAO.Te kody błędów, które mają nazwy formularza AFX_DAO_ERROR_XXX, są udokumentowane w obszarze elementu danych w CDaoException.
m_scode zawiera OLE SCODE obiektów DAO, jeśli ma zastosowanie.Rzadko potrzebne do pracy z tym kodem błędu, jednak.Zwykle więcej informacji jest dostępna w dwóch innych członków.Zobacz członka danych, aby uzyskać więcej informacji SCODE wartości.
Dodatkowe informacje dotyczące błędów DAO, typ obiektu DAO błąd i kolekcji obiektów DAO błędów są dostępne w ramach klasy CDaoException.
Przykład obsługi wyjątków bazy danych
Poniższy przykład próbuje skonstruować CRecordset-pochodzących z obiektów na stercie, z Nowy operator, a następnie otwórz zestaw rekordów (dla źródła danych ODBC).Podobny przykład klasy DAO zobacz "DAO wyjątek przykład" poniżej.
Przykład wyjątku ODBC
Otwórz funkcji składowej może zgłosić wyjątek (typu CDBException dla klas ODBC), więc ten kod w nawiasach Otwórz wywołania z Spróbuj bloku.Kolejne połowu będzie przechwytywać blok CDBException.Można zbadać wyjątek obiekt, nazywane e, ale w tym przypadku wystarczy wiedzieć, że próba utworzenia zestawu rekordów nie powiodło się.Połowu bloku Wyświetla okno komunikatu i czyści przez usunięcie obiektu recordset.
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 podobne do przykładu dla ODBC, ale zazwyczaj można pobrać więcej rodzajów informacji.Poniższy kod również próby otwarcia zestawu rekordów.Jeśli taka próba zgłasza wyjątek, można sprawdzić członek danych obiekt wyjątku dla informacji o błędzie.Jak w poprzednim przykładzie ODBC, prawdopodobnie jest wystarczająco, aby wiedzieć, że próba utworzenia zestawu rekordów nie powiodło 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 Członkowskich obiekt wyjątku.MFC wypełnia tego członka, kiedy to generuje wyjątek.
Omówienie informacji o błędach zwracanych przez CDaoException obiektów, zobacz klasy CDaoException i CDaoErrorInfo.
Podczas pracy z bazami danych Microsoft Jet (MDB) i w większości przypadków podczas pracy z ODBC, będzie istnieć tylko jeden obiekt błędu.W rzadkich przypadkach, gdy używasz źródła danych ODBC i istnieje wiele błędów, można wykonać pętlę DAO w kolekcji błędów, na podstawie liczby błędów zwracanych przez CDaoException::GetErrorCount.Przy każdym przejściu pętli, call CDaoException::GetErrorInfo uzupełniana m_pErrorInfo elementu danych.