Condividi tramite


Eccezioni: eccezioni di database

In questo articolo viene illustrato come gestire le eccezioni del database. La maggior parte del materiale in questo articolo è valida se si utilizzano le classi MFC per ODBC (Open Database Connectivity) o le classi MFC per oggetti DAO (Data Access Object). Viene esplicitato se del materiale è specifico a un modello o all'altro. Gli argomenti trattati includono

  • Approcci alla gestione delle eccezioni

  • Un esempio di gestione delle eccezioni di database

Approcci alla gestione delle eccezioni

L'approccio è lo stesso sia che si utilizzi DAO sia che si utilizzi ODBC.

È necessario scrivere sempre gestori delle eccezioni per gestire condizioni eccezionali.

L'approccio più pragmatico per intercettare le eccezioni del database è testare l'applicazione con gli scenari di eccezione. Determinare le eccezioni probabili che potrebbero verificarsi per un'operazione nel codice e forzare il verificarsi dell'eccezione. Esaminare quindi la traccia di output per verificare quale eccezione viene generata, oppure esaminare le informazioni sull'errore restituite nel debugger. Ciò consente di capire quali codici saranno restituiti per gli scenari di eccezione in uso.

Codici di errore utilizzati per le eccezioni ODBC

Oltre ai codici di ritorno definiti dal framework, con nomi della forma AFX_SQL_ERROR_XXX, alcune CDBExceptions si basano su codici di ritorno di ODBC. I codici di ritorno per tali eccezioni presentano nomi della forma SQL_ERROR_XXX.

I codici di ritorno, sia definiti dal framework sia dall'ODBC, che le classi database possono restituire sono documentati dal membro dati di m_nRetCode del classe CDBException. Informazioni aggiuntive sui codici restituiti definiti da ODBC sono disponibili nella Guida per il programmatore di ODBC SDK nella libreria MSDN.

Codici di errore utilizzati per le eccezioni DAO

Per le eccezioni DAO sono in genere disponibili maggiori informazioni. È possibile accedere alle informazioni di errore tramite tre membri dati di un oggetto CDaoException intercettato:

  • m_pErrorInfo contiene un puntatore a un oggetto CDaoErrorInfo che incapsula informazioni sugli errori nella raccolta DAO di oggetti di errori associati al database.

  • m_nAfxDaoError contiene un codice di errore esteso dalle classi DAO MFC. Questi codici di errore, con nomi della forma AFX_DAO_ERROR_XXX, sono documentati nel membro dati in CDaoException.

  • Se applicabile, m_scode contiene un SCODE OLE da DAO. Tuttavia raramente sarà necessario utilizzare questo codice di errore. Generalmente ulteriori informazioni sono disponibili negli altri due membri dati. Vedere il membro dati per ulteriori informazioni sui valori SCODE.

Informazioni aggiuntive sugli errori di DAO, sul tipo di oggetto di errore DAO e sulla raccolta di errori DAO sono disponibili nella classe CDaoException.

Un esempio di gestione delle eccezioni di database

I tentativi seguenti cercano di costruire un oggetto derivato da CRecordset nell'heap con l'operatore new, dopodiché aprono il recordset (per un'origine dati ODBC). Per un esempio analogo per le classi DAO, vedere "Esempio di eccezione DAO" riportato di seguito.

Esempio di eccezione ODBC

La funzione membro Open potrebbe generare un'eccezione (di tipo CDBException per le classi ODBC), pertanto in questo codice la chiamata di Apri viene posta all'interno di un blocco try. Il successivo blocco catch intercetterà una CDBException. È possibile esaminare lo stesso oggetto eccezione, denominato e, ma in questo caso è sufficiente sapere che il tentativo di creazione di un recordset non è riuscito. Il blocco di catch visualizzare una finestra di messaggio ed effettua una pulizia eliminando l'oggetto 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;
}

Esempio di eccezione DAO

L'esempio DAO è analogo a quello per ODBC, ma in genere è possibile recuperare più tipi di informazioni. Anche il codice seguente prova ad aprire un recordset. Se il tentativo genera un'eccezione, è possibile esaminare un membro dati dell'oggetto eccezione per ottenere informazioni sull'errore. Come con il precedente esempio ODBC, è probabilmente sufficiente sapere che il tentativo di creazione di un recordset non è riuscito.

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

Questo codice ottiene una messaggio di errore sottoforma di stringa dal membro m_pErrorInfo dell'oggetto eccezione. MFC inserisce i dati in questo membro quando genera l'eccezione.

Per una descrizione delle informazioni sull'errore restituito da un oggetto CDaoException, vedere le classi CDaoException e CDaoErrorInfo.

Quando si utilizzano i database Microsoft Jet (.mdb) e nella maggior parte dei casi quando si lavora con ODBC, sarà presente un solo oggetto di errore. Nei rari casi in cui si utilizza un'origine dati ODBC e si verificano più errori, è possibile scorrere in ciclo la raccolta degli errori DAO in base al numero di errori restituiti da CDaoException::GetErrorCount. All'interno del ciclo, chiamare ogni volta CDaoException::GetErrorInfo per inserire di nuovo i dati nel membro membro dati m_pErrorInfo.

Vedere anche

Concetti

Gestione delle eccezioni in MFC