Condividi tramite


Eccezioni: eccezioni di database

Questo articolo illustra come gestire le eccezioni del database. La maggior parte del materiale in questo articolo si applica se si utilizzano le classi MFC per Open Database Connessione ivity (ODBC) o le classi MFC per gli oggetti DAO (Data Access Objects). Il materiale specifico di uno o l'altro modello viene contrassegnato in modo esplicito. Gli argomenti includono:

Approcci alla gestione delle eccezioni

L'approccio è lo stesso se si lavora con DAO (obsoleto) o ODBC.

È consigliabile scrivere sempre gestori eccezioni per gestire condizioni eccezionali.

L'approccio più pragmatico per rilevare le eccezioni del database consiste nel testare l'applicazione con scenari di eccezione. Determinare le eccezioni probabili che possono verificarsi per un'operazione nel codice e forzare l'eccezione. Esaminare quindi l'output della traccia per verificare l'eccezione generata o esaminare le informazioni sull'errore restituite nel debugger. In questo modo è possibile sapere quali codici restituiti verranno visualizzati per gli scenari di eccezione in uso.

Codici di errore usati per le eccezioni ODBC

Oltre ai codici restituiti definiti dal framework, che hanno nomi del modulo AFX_SQL_ERROR_XXX, alcune espressioni CDBExceptions si basano sui codici restituiti ODBC. I codici restituiti per tali eccezioni hanno nomi del modulo SQL_ERROR_XXX.

I codici restituiti, definiti dal framework e definiti da ODBC, che le classi di database possono restituire sono documentati nel m_nRetCode membro dati della classe CDBException. Altre informazioni sui codici restituiti definiti da ODBC sono disponibili nella guida di riferimento per programmatori ODBC.

Codici di errore usati per le eccezioni DAO

Per le eccezioni DAO, sono in genere disponibili altre informazioni. È possibile accedere alle informazioni sugli errori tramite tre membri dati di un oggetto CDaoException rilevato:

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

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

  • m_scode contiene un codice OLE SCODE da DAO, se applicabile. Raramente sarà necessario usare questo codice di errore. In genere sono disponibili altre informazioni negli altri due membri dati. Per altre informazioni sui valori di SCODE , vedere il membro dati.

Altre informazioni sugli errori DAO, sul tipo di oggetto DAO Error e sull'insieme DAO Errors sono disponibili nella classe CDaoException.

Esempio di gestione delle eccezioni del database

Nell'esempio seguente viene tentato di costruire un oggetto derivato da CRecordset nell'heap con l'operatore new e quindi aprire il recordset (per un'origine dati ODBC). Per un esempio simile per le classi DAO, vedere "Esempio di eccezione DAO" di seguito.

Esempio di eccezione ODBC

La funzione membro Open potrebbe generare un'eccezione (di tipo CDBException per le classi ODBC), quindi questa parentesi di codice include una Open chiamata con un try blocco. Il blocco successivo catch intercetta un oggetto CDBException. È possibile esaminare l'oggetto eccezione stesso, denominato e, ma in questo caso è sufficiente sapere che il tentativo di creare un recordset non è riuscito. Il catch blocco visualizza una finestra di messaggio e pulisce 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 è simile all'esempio per ODBC, ma in genere è possibile recuperare più tipi di informazioni. Il codice seguente tenta anche di aprire un recordset. Se questo tentativo genera un'eccezione, è possibile esaminare un membro dati dell'oggetto eccezione per ottenere informazioni sull'errore. Come nell'esempio ODBC precedente, è probabile che sia sufficiente sapere che il tentativo di creare 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 stringa di messaggio di errore dal membro m_pErrorInfo dell'oggetto eccezione. MFC riempie questo membro quando genera l'eccezione.

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

Quando si utilizzano i database Microsoft Jet (.mdb) e nella maggior parte dei casi quando si utilizza ODBC, sarà presente un solo oggetto errore. Nel raro caso in cui si usa un'origine dati ODBC e si verificano più errori, è possibile scorrere in ciclo l'insieme Errors di DAO in base al numero di errori restituiti da CDaoException::GetErrorCount. Ogni volta che si passa attraverso il ciclo, chiamare CDaoException::GetErrorInfo per riempire di nuovo il m_pErrorInfo membro dati.

Vedi anche

Gestione delle eccezioni