Исключения: исключения базы данных
В этой статье описывается, как обрабатывать исключения базы данных.Большая часть материала в этой статье применяется того, работаете ли вы с классами 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 SDK справочника по программированию ODBC в библиотеке MSDN.
Коды ошибок, используемые для исключений DAO
Для исключений DAO дополнительные сведения обычно доступны.Можно получить доступ к сведениям об ошибке через 3 элемента данных уловленного объекта CDaoException:
m_pErrorInfo содержит указатель на объект CDaoErrorInfo, инкапсулирующий сведения об ошибке в коллекции объектов DAO ошибки, связанные с базой данных.
m_nAfxDaoError содержащий расширенный код ошибки из классов MFC DAO.Эти коды ошибок, которые имеют имена, AFX_DAO_ERROR_XXX описаны формы под элементом данных в CDaoException.
OLE m_scode содержит 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.