Исключения. Исключения баз данных
В этой статье описывается, как обрабатывать исключения баз данных. Большая часть материала в этой статье применяется работаете ли вы с классами MFC для ODBC (ODBC) или классами MFC DAO для (DAO). Материала с одной или другую модель явно помечена. Ниже приведен список разделов.
Подходы к обработке исключений
Пример обработки исключений базы данных
Подходы к обработке исключений
Подход аналогичен то, что DAO или ODBC.
Следует всегда писать обработчики исключений в этом дескриптора исключительным.
Наиболее прагматический подход к исключениям заразительным базы данных запускать приложение в сценариях исключения. Определите возникает исключения, которые могут встречаться в операции в коде, а принудительное исключение, чтобы ошибка. Затем проверьте результаты трассировки, чтобы определить, какое исключение, или проверить, возвращаются сведения об ошибке в отладчике. Это позволяет получать сведения, коды возврата появится сценариям исключения используется.
Коды ошибок, используемые для исключений ODBC
В дополнение к кодам возврата указанным платформой, с именами формы AFX_SQL_ERROR_XXX, некоторые CDBExceptions основана на кодах возврата ODBC. Коды возврата для таких исключений, имеют имена формы SQL_ERROR_XXX.
Коды возврата и .NET Framework, и ODBC- указанный —, классы базы данных могут возвращать описаны в элемент данных m_nRetCode класса CDBException. Дополнительные сведения о кодах возврата указанных ODBC доступно в справочнике программиста ODBC SDK в библиотеке MSDN.
Коды ошибок, используемые для исключений DAO
Для исключений DAO обычно доступны дополнительные сведения. Можно просмотреть сведения об ошибке доступа через 3 элемента данных уловленного объекта CDaoException.
m_pErrorInfo содержит указатель на объект CDaoErrorInfo, который инкапсулирует сведения об ошибке в коллекции DAO объектов ошибок, связанных с базой данных.
m_nAfxDaoError расширенный содержит код ошибки из классов MFC DAO. Эти коды ошибок, с именами AFX_DAO_ERROR_XXX формы, содержится в элементе данных в CDaoException.
m_scode содержит OLE SCODE из DAO, если применимо. Иногда бывает необходимо для работы с этим кодом ошибки, однако. Обычно дополнительные сведения доступны в других элементах данных 2. См. также: элемент данных дополнительные сведения о значениях SCODE.
Дополнительные сведения об ошибках DAO, типе объекта ошибки DAO и коллекции ошибок DAO доступно в классом CDaoException.
Пример обработки исключений базы данных
В следующем примере выполняется попытка создать CRecordset- производного объекта в куче с помощью оператора новый, а затем открыть набор записей (для источника данных ODBC). Для подобного примера для классов DAO см. в разделе «пример исключения DAO» ниже.
Пример исключения ODBC
Исключение может вызывать функцию-член Открыть (типа CDBException для классов ODBC), поэтому квадратные скобки этого кода вызов Открыть с помощью блока try. Следующий блок catch будет перехватывать CDBException. Можно просмотреть самого объекта исключения, вызывается e, но в этом случае достаточно, чтобы узнать, что попытка создать набор записей завершилась неудачно. Блок catch показывает окно сообщения и очищает путем удаления объекта набора записей.
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
Пример DAO похож на пример для ODBC, но обычно можно извлечь несколько типов данных. Следующий код также пытается открыть набор записей. Если попытка создает исключение, можно просмотреть элемент данных объекта исключения для сведений об ошибке. Как и в предыдущем примере ODBC, возможно, достаточно знать, что попытка создать набор записей завершилась неудачно.
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;
}
Этот код получает строку сообщения об ошибке от члена m_pErrorInfo объекта исключения. MFC такое член, если она вызывает исключение.
Обсуждение сведений об ошибке возвращать объектом CDaoException см. классы CDaoException и CDaoErrorInfo.
При работе с базами данных Microsoft Jet (.mdb), и в большинстве случаев при работе с ODBC, будет только один объект ошибки. В тех редких случаях при использовании источника данных ODBC и множественные ошибки можно цикл через коллекцию ошибок на основе DAO количества ошибок, возвращаемых CDaoException::GetErrorCount. Каждый раз цикл через вызов CDaoException::GetErrorInfo, чтобы refill элемент данных m_pErrorInfo.