다음을 통해 공유


예외: 데이터베이스 예외

이 문서에서는 데이터베이스 예외를 처리하는 방법을 설명합니다. 이 문서의 자료 대부분은 ODBC(Open Database 커넥트ivity)용 MFC 클래스 또는 DAO(데이터 액세스 개체)에 대한 MFC 클래스를 사용하는지 여부에 관계없이 적용됩니다. 하나 또는 다른 모델과 관련된 재질은 명시적으로 표시됩니다. 다룰 주제는 다음과 같습니다.

예외 처리에 대한 접근 방식

이 방법은 DAO(사용되지 않음) 또는 ODBC로 작업하든 동일합니다.

예외 조건을 처리하려면 항상 예외 처리기를 작성해야 합니다.

데이터베이스 예외를 catch하는 가장 실용적인 방법은 예외 시나리오를 사용하여 애플리케이션을 테스트하는 것입니다. 코드의 작업에 발생할 수 있는 예외를 확인하고 예외가 강제로 발생하도록 합니다. 그런 다음 추적 출력을 검사하여 throw되는 예외를 확인하거나 디버거에서 반환된 오류 정보를 검사합니다. 이를 통해 사용 중인 예외 시나리오에 대해 표시할 반환 코드를 알 수 있습니다.

ODBC 예외에 사용되는 오류 코드

AFX_SQL_ERROR_XXX 형식의 이름이 있는 프레임워크에서 정의한 코드를 반환하는 것 외에도 일부 CDBExceptions는 ODBC 반환 코드를 기반으로 합니다. 이러한 예외에 대한 반환 코드에는 SQL_ERROR_XXX 양식의 이름이 있습니다.

데이터베이스 클래스가 반환할 수 있는 프레임워크 정의 및 ODBC 정의 반환 코드는 클래스CDBException의 m_nRetCode 데이터 멤버 아래에 설명되어 있습니다. ODBC에서 정의한 반환 코드에 대한 추가 정보는 ODBC 프로그래머 참조에서 확인할 수 있습니다.

DAO 예외에 사용되는 오류 코드

DAO 예외의 경우 일반적으로 자세한 정보를 사용할 수 있습니다. Catch 된 CDaoException 개체의 세 가지 데이터 멤버를 통해 오류 정보에 액세스할 수 있습니다.

  • m_pErrorInfo 데이터베이스와 연결된 DAO의 오류 개체 컬렉션에 오류 정보를 캡슐화하는 CDaoErrorInfo 개체에 대한 포인터를 포함합니다.

  • m_nAfxDaoError MFC DAO 클래스의 확장된 오류 코드를 포함합니다. 양식 의 이름이 AFX_DAO_ERROR_XXX 이러한 오류 코드는 의 데이터 멤버 CDaoException아래에 설명되어 있습니다.

  • m_scode 해당하는 경우 DAO의 OLE SCODE를 포함합니다. 그러나 이 오류 코드를 사용할 필요는 거의 없습니다. 일반적으로 다른 두 데이터 멤버에서 더 많은 정보를 사용할 수 있습니다. SCODE 값에 대한 자세한 내용은 데이터 멤버를 참조하세요.

DAO 오류, DAO 오류 개체 유형 및 DAO Errors 컬렉션에 대한 추가 정보는 CDaoException 클래스에서 사용할 수 있습니다.

데이터베이스 예외 처리 예제

다음 예제에서는 연산자를 사용하여 힙 new 에서 CRecordset 파생 개체를 생성한 다음 레코드 집합(ODBC 데이터 원본의 경우)을 열려고 시도합니다. DAO 클래스에 대한 유사한 예제는 아래의 "DAO 예외 예제"를 참조하세요.

ODBC 예외 예제

Open 멤버 함수는 예외(ODBC 클래스에 대한 CDBException 형식)를 throw할 수 있으므로 이 코드는 호출을 Open 블록으로 대괄호로 try 묶습니다. 후속 catch 블록은 .를 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의 예제와 유사하지만 일반적으로 더 많은 종류의 정보를 검색할 수 있습니다. 또한 다음 코드는 레코드 집합을 열려고 시도합니다. 이 시도가 예외를 throw하는 경우 예외 개체의 데이터 멤버에서 오류 정보를 검사할 수 있습니다. 이전 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는 예외를 throw할 때 이 멤버를 채웁니다.

개체에서 반환된 CDaoException 오류 정보에 대한 자세한 내용은 CDaoExceptionCDaoErrorInfo 클래스를 참조하세요.

Microsoft Jet(.mdb) 데이터베이스로 작업하는 경우 대부분의 경우 ODBC를 사용하는 경우 오류 개체가 하나만 있습니다. 드문 경우지만 ODBC 데이터 원본을 사용하고 여러 오류가 있는 경우 CDaoException::GetErrorCount에서 반환된 오류 수에 따라 DAO의 Errors 컬렉션을 반복할 수 있습니다. 루프를 통해 매번 CDaoException::GetErrorInfo를 호출하여 데이터 멤버를 m_pErrorInfo 다시 채우세요.

참고 항목

예외 처리