Wyjątki: wyjątki bazy danych

W tym artykule objaśniono sposób obsługi wyjątków bazy danych.Większość materiału w niniejszym artykule stosuje się zarówno w czasie pracy z klas MFC Open Database Connectivity (ODBC) lub klas MFC Data Access Objects (DAO).Materiał określony dla jeden lub drugi model jest wyraźnie oznakowane.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

To podejście jest taka sama, czy pracujesz z DAO lub ODBC.

Zawsze należy napisać procedur obsługi wyjątków, wyjątkowych warunkach obsługi.

Najbardziej pragmatyczne podejście do połowu wyjątki bazy danych służy do testowania aplikacji z wyjątkiem scenariuszy.Określić prawdopodobne wyjątków, które mogą wystąpić dla operacji w kodzie, a siła wyjątek występuje.Przeanalizuj wyjście śledzenia, aby zobaczyć, co jest wyjątek lub bada informacje zwrócony błąd w debugerze.Pozwoli to ustalić, które zwracają kodów, to zobaczysz w scenariuszach wyjątek, którego używasz.

Kody błędów używane dla wyjątków ODBC

Oprócz zwracanych kodów zdefiniowanych w ramach, które mają nazwy formularza AFX_SQL_ERROR_XXX, niektóre CDBExceptions są oparte na ODBC zwracają kodów.Kody powrotne wyjątki takie mają nazwy formularza SQL_ERROR_XXX.

Kody powrotne — zarówno framework zdefiniowane i zdefiniowane przez ODBC — klasami baz danych można powrócić, opisano w odpowiedzi na m_nRetCode danych członka klasy CDBException.Dodatkowe informacje dotyczące zwracanych kodów zdefiniowane przez ODBC są dostępne 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łędach można uzyskać dostęp za pośrednictwem trzech danych członków złowione CDaoException obiekt:

  • m_pErrorInfo zawiera wskaźnik do CDaoErrorInfo obiekt, który zawiera informacje o błędach w kolekcji obiektów DAO w błąd obiektów skojarzonych z bazy danych.

  • m_nAfxDaoError zawiera ponadto 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 obszarze członek danych w CDaoException.

  • m_scode zawiera OLE SCODE obiektów DAO, jeśli ma zastosowanie.Rzadko kiedy będziesz musiał jednak pracować z tym kodem błędu.Zwykle więcej informacji jest dostępne w dwóch innych składników.Zobacz element danych, aby uzyskać więcej informacji SCODE wartości.

Dodatkowe informacje o błędach, typ obiektu DAO błąd i kolekcji DAO Errors DAO jest dostępne w klasie CDaoException.

Przykład obsługi wyjątków bazy danych

Poniższy przykład próbuje skonstruować CRecordset-pochodnych obiektu 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 członka może zgłosić wyjątek (typu CDBException dla klas ODBC), więc ten kod w nawiasach Otwórz wywołanie z Spróbuj bloku.Kolejne połowu bloku będzie przechwytywać CDBException.Można zbadać wyjątek sam obiekt, o nazwie e, ale w tym przypadku to wystarczy wiedzieć, że nie powiodła się próba utworzenia zestawu rekordów.Połowu bloku Wyświetla okno z komunikatem 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

W przykładzie DAO jest podobny do przykładu dla ODBC, ale zazwyczaj można pobrać więcej rodzajów informacji.Ponadto następujący kod próbuje otworzyć zestaw rekordów.Jeśli taka próba zgłasza wyjątek, można sprawdzić element członkowski danych obiektu wyjątek dla informacji o błędzie.Jak w poprzednim przykładzie ODBC, to prawdopodobnie wystarczy 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 komunikat o błędzie ciąg z m_pErrorInfo Członkowskich obiekt wyjątku.Po jej zgłasza wyjątek MFC wprowadza ten element członkowski.

Omówienie informacji o błędach zwrócone przez CDaoException obiektów, zobacz klasy CDaoException i CDaoErrorInfo.

Podczas pracy z bazami danych Microsoft Jet (MDB), a 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 ma wiele błędów, można pętli do kolekcji Errors DAO's na podstawie liczby błędy zwrócone przez CDaoException::GetErrorCount.Każdym przejściu pętli, call CDaoException::GetErrorInfo do napełniania m_pErrorInfo element członkowski danych.

Zobacz też

Koncepcje

Obsługa wyjątków w MFC