Eccezioni: Eccezioni di database
In questo articolo viene illustrato come gestire le eccezioni del database.La maggior parte del materiale in questo articolo viene applicata se si utilizzano le classi MFC per ODBC (open database connectivity) o le classi MFC per DAO (data access (DAO) objects).Specifico materiale altro a un modello o viene assegnata un'etichetta in modo esplicito.Gli argomenti trattati includono
Approcci alla gestione delle eccezioni
Un esempio di gestione delle eccezioni del database
Approcci alla gestione delle eccezioni
L'approccio è lo stesso se si utilizza DAO o ODBC.
È necessario scrivere sempre i gestori di eccezioni a condizioni eccezionali di handle.
L'approccio più pragmatico a intercettare eccezioni del database è testare l'applicazione con gli scenari di eccezione.Determinare le eccezioni probabile che potrebbero verificarsi per un'operazione nel codice e imporre eccezione per verificare.Quindi esaminare l'output di traccia per determinare quale eccezione viene generata un'eccezione, o per esaminare le informazioni sugli errori restituite nel debugger.Ciò consente di individuare i codici restituiti saranno visualizzati per gli scenari di eccezione uso.
Codici di errore utilizzati per le eccezioni ODBC
Oltre ai codici restituiti definiti dal framework, con nomi del form AFX_SQL_ERROR_XXX, un determinato CDBExceptions basato sui codici restituiti di ODBC .I codici restituiti per tali eccezioni presentano nomi del form SQL_ERROR_XXX.
I codici restituiti — sia Framework-definito che ODBC-definito — che le classi di database possono restituire documentati nel membro dati di m_nRetCode di classe CDBException.Informazioni aggiuntive sui codici restituiti definiti dall'ODBC sono disponibili in ODBC SDK in MSDN Library.
Codici di errore utilizzati per le eccezioni di DAO
per le eccezioni di DAO, più informazioni sono in genere disponibili.È possibile informazioni di errore di accesso da tre membri dati di un oggetto rilevato di CDaoException :
m_pErrorInfo contiene un puntatore a un oggetto di CDaoErrorInfo che incapsula informazioni sugli errori nella raccolta di DAO di oggetti errori associati al database.
m_nAfxDaoError contiene un codice di errore esteso dalle classi DAO MFC.Questi codici di errore, con nomi del form AFX_DAO_ERROR_XXX, sono documentati nel membro dati in CDaoException.
m_scode contiene un OLE SCODE da DAO, se applicabile.Sarà necessario raramente utilizzare questo codice di errore, tuttavia.In genere ulteriori informazioni sono disponibili negli altri due membri dati.Vedere il membro dati per ulteriori informazioni sui valori di SCODE .
Informazioni aggiuntive sugli errori di DAO, il tipo di oggetto error di DAO e la raccolta degli errori di DAO sono disponibili nell'ambito della classe CDaoException.
Un esempio di gestione delle eccezioni del database
I successivi tentativi di esempio di costruire CRecordsetoggetto derivato da nell'heap con l'operatore di new quindi di apertura del recordset (per un'origine dati ODBC).Per un esempio analogo per le classi DAO, vedere “esempio di eccezione DAO„ in.
Esempio di eccezione ODBC
La funzione membro di Aprire potrebbe generare un'eccezione (di tipo CDBException per le classi ODBC), in modo da parentesi di questo codice la chiamata di Apri con un blocco di try .Il blocco catch successiva rileverà CDBException.È possibile esaminare l'oggetto eccezione stesso, denominato e, ma in questo caso è sufficiente per sapere se il tentativo di creazione di un recordset ha esito negativo.Il blocco catch viene visualizzata una finestra di messaggio e pulita 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 di DAO
L'esempio di DAO è simile a quello per ODBC, ma in genere è possibile recuperare più tipi di informazioni.Il codice seguente si tenta di aprire un recordset.Se il tentativo genera un'eccezione, è possibile esaminare un membro dati dell'oggetto eccezione per informazioni sull'errore.Come con l'esempio precedente ODBC, è sufficiente probabilmente sapere che il tentativo di creazione di un recordset non riuscire.
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 di m_pErrorInfo dell'oggetto eccezione.MFC fornisce il membro quando genera l'eccezione.
Per una descrizione delle informazioni sull'errore restituito da un oggetto di 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 errore.Nei rari casi quando si utilizza un'origine dati ODBC e esistono più errori, è possibile scorrere la raccolta degli errori di DAO in base al numero di errori restituiti da CDaoException::GetErrorCount.Ogni volta che il ciclo, chiamare CDaoException::GetErrorInfo per riempire il membro dati di m_pErrorInfo .