Megosztás a következőn keresztül:


Kivételek: Adatbázis-kivételek

Ez a cikk az adatbázis-kivételek kezelését ismerteti. A cikkben szereplő anyagok többsége az Open Database Connectivity (ODBC) MFC-osztályaival vagy az adatelérési objektumok MFC-osztályaival (DAO) foglalkozik. Az egyik vagy a másik modellre jellemző anyag explicit módon van megjelölve. A témakörök a következők:

A kivételkezelés megközelítései

A megközelítés ugyanaz, akár a DAO-val (elavult) vagy az ODBC-vel dolgozik.

A kivételes feltételek kezeléséhez mindig írjon kivételkezelőket.

Az adatbáziskivételek észlelésének legpraktikusabb módszere az alkalmazás kivételforgatókönyvekkel való tesztelése. Határozza meg a kód egy műveletéhez esetleg előforduló valószínűsíthető kivételeket, és kényszerítse ki a kivételt. Ezután vizsgálja meg a nyomkövetési kimenetet, hogy lássa, milyen kivételt dobnak, vagy ellenőrizze a hibakeresőben visszaadott hibainformációkat. Ez jelzi, hogy mely visszatérési kódok jelennek meg a használt kivételes forgatókönyvekhez.

ODBC-kivételekhez használt hibakódok

A keretrendszer által definiált, AFX_SQL_ERROR_XXX űrlapnevekkel rendelkező visszatérési kódok mellett egyes CDBExceptions-kódokODBC-visszatérési kódokon alapulnak. Az ilyen kivételek visszatérési kódjai az űrlap SQL_ERROR_XXX neveivel rendelkeznek.

A keretrendszer által definiált és ODBC-ben definiált visszatérési kódok, amelyeket az adatbázisosztályok visszaadhatnak, az osztályCDBExceptionm_nRetCode adattagja alatt vannak dokumentálva. Az ODBC által definiált visszatérési kódokkal kapcsolatos további információk az ODBC programozói referenciajában találhatók.

DAO-kivételekhez használt hibakódok

A DAO-kivételekről általában további információk érhetők el. A hibainformációkat a CDaoException objektum három adattagjának egyikén keresztül érheti el, miután elkapta azt.

  • m_pErrorInfo tartalmaz egy CDaoErrorInfo objektumra mutató mutatót, amely az adatbázishoz társított hibaobjektumok DAO-gyűjteményében található hibainformációkat foglalja magában.

  • m_nAfxDaoError az MFC DAO-osztályok kiterjesztett hibakódját tartalmazza. Ezek a hibakódok, amelyek az AFX_DAO_ERROR_XXX formátumú nevekkel rendelkeznek, a CDaoException adattag alatt vannak dokumentálva.

  • m_scode tartalmaz egy OLE SCODE-t a DAO-ból, ha van ilyen. Ezzel a hibakóddal azonban ritkán kell dolgoznia. Általában több információ érhető el a másik két adattagban. Az SCODE-értékekkel kapcsolatos további információkért tekintse meg az adattagot.

További információ a DAO-hibákról, a DAO-hibaobjektum típusáról és a DAO-hibák gyűjteményéről a CDaoException osztályban érhető el.

Példa egy adatbázisra Exception-Handling

Az alábbi példa egy CRecordset-származtatott objektumot próbál létrehozni a halomra az new operátorral, majd megnyitja a rekordhalmazt (ODBC-adatforráshoz). A DAO-osztályokhoz hasonló példáért lásd alább a "DAO exception Example" (DAO-kivétel példája) című témakört.

A PÉLDA az ODBC-kivételre

Az Open member függvény kivételt okozhat (az ODBC-osztályok ESETÉBEN CDBException típusú), így ez a kód egy Open blokkmal szögeli a try hívást. A következő catch blokk elkap egy CDBException. Megvizsgálhatja magát a kivételobjektumot, amelyet e-nak hívnak, de ebben az esetben elég tudni, hogy az adatkészlet létrehozására tett kísérlet meghiúsult. A catch blokk egy üzenetmezőt jelenít meg, és törli a rekordhalmaz-objektumot.

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;
}

DAO kivétel példa

A DAO-példa hasonló az ODBC-példához, de általában többféle információt is lekérhet. Az alábbi kód egy rekordhalmazt is megpróbál megnyitni. Ha ez a kísérlet kivételt okoz, hibainformációk alapján megvizsgálhatja a kivételobjektum egy adattagját. Az előző ODBC-példához hasonlóan valószínűleg elég tudni, hogy a rekordhalmaz létrehozására tett kísérlet meghiúsult.

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;
}

Ez a kód egy hibaüzenet-sztringet kap a kivételobjektum m_pErrorInfo tagjától. Az MFC kitölti ezt a tagot, amikor kivételt vet ki.

Az objektum által CDaoException visszaadott hibainformációkat a CDaoException és a CDaoErrorInfo osztályban tekintheti meg.

Amikor Microsoft Jet -adatbázisokkal (.mdb) dolgozik, és a legtöbb esetben az ODBC-vel dolgozik, csak egy hibaobjektum lesz. Abban a ritka esetben, amikor ODBC-adatforrást használ, és több hiba is előfordul, a CDaoException::GetErrorCount által visszaadott hibák száma alapján végighaladhat a DAO Hibagyűjteményén. A cikluson keresztül minden alkalommal hívja meg a CDaoException::GetErrorInfo parancsot az m_pErrorInfo adattag újratöltéséhez.

Lásd még

Kivételkezelés