Udostępnij za pośrednictwem


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 funkcji Open Database Connectivity (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 (jest 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ź wynik śledzenia, aby zobaczyć, jaki wyjątek jest generowany, 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 strukturę, które mają nazwy w formie AFX_SQL_ERROR_XXX, niektóre CDBExceptions są oparte na kodach powrotnych ODBC. Kody powrotne dla takich wyjątków mają nazwy w formie SQL_ERROR_XXX.

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ć przez trzy składowe danych przechwyconego obiektu CDaoException :

  • m_pErrorInfo zawiera wskaźnik do obiektu CDaoErrorInfo, który enkapsuluje informacje o błędzie w kolekcji obiektów błędów DAO związanych z bazą danych.

  • m_nAfxDaoError zawiera rozszerzony kod błędu z klas MFC DAO. Te kody błędów, które mają nazwy formy AFX_DAO_ERROR_XXX, są udokumentowane w członie danych w 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 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 Exception-Handling 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 członkowska Open może zgłosić wyjątek (typu CDBException dla klas ODBC), więc ten kod obejmuje wywołanie Open 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ć składową danych obiektu wyjątku w poszukiwaniu 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 członka m_pErrorInfo obiektu wyjątku. MFC wypełnia tę składową, gdy wyrzuca 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), a w większości przypadków podczas pracy z ODBC będzie występować tylko jeden obiekt błędu. W rzadkich sytuacjach, gdy używasz źródła danych ODBC i występuje wiele błędów, możesz przejrzeć kolekcję błędów obiektu DAO na podstawie liczby błędów zwracanych przez CDaoException::GetErrorCount. Za każdym razem w pętli wywołaj metodę CDaoException::GetErrorInfo, aby uzupełnić członka danych m_pErrorInfo.

Zobacz także

Obsługa wyjątków