例外処理 : データベースの例外Exceptions: Database Exceptions

この記事では、データベースの例外を処理する方法について説明します。This article explains how to handle database exceptions. この記事の内容の大部分は、Open Database Connectivity (ODBC) 用の MFC クラス、またはデータアクセスオブジェクト (DAO) 用の MFC クラスを使用している場合に適用されます。Most of the material in this article applies whether you are working with the MFC classes for Open Database Connectivity (ODBC) or the MFC classes for Data Access Objects (DAO). 一方または他のモデルに固有の素材が明示的にマークされます。Material specific to one or the other model is explicitly marked. 取り上げるトピックは次のとおりです。Topics include:

例外処理の方法Approaches to Exception Handling

DAO (obsolete) と ODBC のどちらを使用している場合でも、この方法は同じです。The approach is the same whether you are working with DAO (obsolete) or ODBC.

例外的な条件を処理するには、常に例外ハンドラーを記述する必要があります。You should always write exception handlers to handle exceptional conditions.

データベースの例外をキャッチする最も実用的な方法は、例外シナリオでアプリケーションをテストすることです。The most pragmatic approach to catching database exceptions is to test your application with exception scenarios. コード内の操作に対して発生する可能性がある例外を判断し、例外を強制的に発生させます。Determine the likely exceptions that might occur for an operation in your code, and force the exception to occur. 次に、トレース出力を調べて、スローされた例外を確認するか、デバッガーで返されたエラー情報を調べます。Then examine the trace output to see what exception is thrown, or examine the returned error information in the debugger. これにより、使用している例外のシナリオに対してどのリターンコードが表示されるかを知ることができます。This lets you know which return codes you'll see for the exception scenarios you are using.

ODBC 例外に使用されるエラーコードError Codes Used for ODBC Exceptions

フレームワークによって定義されたリターンコードに加えて、 AFX_SQL_ERROR_XXX フォームの名前が付いているため、一部の CDBExceptionsODBC のリターンコードに基づいています。In addition to return codes defined by the framework, which have names of the form AFX_SQL_ERROR_XXX, some CDBExceptions are based on ODBC return codes. このような例外のリターンコードには SQL_ERROR_XXX の形式の名前があります。The return codes for such exceptions have names of the form SQL_ERROR_XXX.

データベースクラスが返すことができるリターンコード (フレームワーク定義と ODBC 定義の両方) は、クラスの m_nRetCode データメンバーの下に記載されてい CDBException ます。The return codes — both framework-defined and ODBC-defined — that the database classes can return are documented under the m_nRetCode data member of class CDBException. Odbc で定義されているリターンコードの詳細については、 Odbc プログラマーズリファレンスを参照してください。Additional information about return codes defined by ODBC is available in the ODBC Programmer's Reference.

DAO 例外に使用されるエラーコードError Codes Used for DAO Exceptions

DAO の例外については、通常、詳細情報を参照してください。For DAO exceptions, more information is typically available. キャッチされた CDaoException オブジェクトの3つのデータメンバーを通じて、エラー情報にアクセスできます。You can access error information through three data members of a caught CDaoException object:

  • m_pErrorInfo には、DAO のデータベースに関連付けられているエラーオブジェクトのコレクションにエラー情報をカプセル化する CDaoErrorInfo オブジェクトへのポインターが含まれています。m_pErrorInfo contains a pointer to a CDaoErrorInfo object that encapsulates error information in DAO's collection of error objects associated with the database.

  • m_nAfxDaoError には、MFC DAO クラスの拡張エラーコードが含まれています。m_nAfxDaoError contains an extended error code from the MFC DAO classes. これらのエラーコードには AFX_DAO_ERROR_XXX 形式の名前が付いており、のデータメンバーの下に記載されてい CDaoException ます。These error codes, which have names of the form AFX_DAO_ERROR_XXX, are documented under the data member in CDaoException.

  • 必要に応じて、DAO から OLE scodem_scodeに含まれています。m_scode contains an OLE SCODE from DAO, if applicable. ただし、このエラーコードを使用する必要はほとんどありません。You'll seldom need to work with this error code, however. 通常、他の2つのデータメンバーでは、より多くの情報を使用できます。Usually more information is available in the other two data members. SCODE 値の詳細については、データメンバーを参照してください。See the data member for more about SCODE values.

DAO エラー、DAO エラーオブジェクトの種類、DAO エラーのコレクションの詳細については、「 CDaoExceptionクラス」を参照してください。Additional information about DAO errors, the DAO Error object type, and the DAO Errors collection is available under class CDaoException.

データベース Exception-Handling の例A Database Exception-Handling Example

次の例では、演算子を使用して、ヒープ上に CRecordsetから派生したオブジェクトを構築 new し、そのレコードセット (ODBC データソース用) を開きます。The following example attempts to construct a CRecordset-derived object on the heap with the new operator, and then open the recordset (for an ODBC data source). 同様の DAO クラスの例については、以下の「DAO 例外の例」を参照してください。For a similar example for the DAO classes, see "DAO Exception Example" below.

ODBC 例外の例ODBC Exception Example

Openメンバー関数は、(ODBC クラスの CDBException型の) 例外をスローする可能性があるため、このコードはブロックを使用して呼び出しを角かっこ Open で囲み try ます。The Open member function could throw an exception (of type CDBException for the ODBC classes), so this code brackets the Open call with a try block. 後続の catch ブロックはをキャッチ CDBException します。The subsequent catch block will catch a CDBException. という例外オブジェクト自体を調べることもでき e ますが、この場合は、レコードセットを作成しようとしたときに失敗したことを把握しておく必要があります。You could examine the exception object itself, called e, but in this case it is enough to know that the attempt to create a recordset has failed. ブロックは、 catch メッセージボックスを表示し、レコードセットオブジェクトを削除してクリーンアップします。The catch block displays a message box and cleans up by deleting the recordset object.

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 Exception Example

DAO の例は ODBC の例と似ていますが、通常はさらに多くの種類の情報を取得できます。The DAO example is similar to the example for ODBC, but you can typically retrieve more kinds of information. 次のコードでは、レコードセットも開こうとします。The following code also attempts to open a recordset. この試行によって例外がスローされた場合は、例外オブジェクトのデータメンバーにエラー情報があるかどうかを調べることができます。If that attempt throws an exception, you can examine a data member of the exception object for error information. 前の ODBC の例と同様に、レコードセットを作成しようとして失敗したことを把握しておくと十分でしょう。As with the previous ODBC example, it is probably enough to know that the attempt to create a recordset failed.

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;
}

このコードは、exception オブジェクトの m_pErrorInfo メンバーからのエラーメッセージ文字列を取得します。This code gets an error message string from the m_pErrorInfo member of the exception object. MFC は、例外をスローするときにこのメンバーを塗りつぶします。MFC fills this member when it throws the exception.

オブジェクトによって返されるエラー情報の詳細につい CDaoException ては、「Classes CDaoException and CDaoErrorInfo」を参照してください。For a discussion of the error information returned by a CDaoException object, see classes CDaoException and CDaoErrorInfo.

Microsoft Jet (.mdb) データベースを操作しているときに、ほとんどの場合 ODBC を操作しているときは、エラーオブジェクトは1つだけです。When you are working with Microsoft Jet (.mdb) databases, and in most cases when you are working with ODBC, there will be only one error object. まれに、ODBC データソースを使用しているときに複数のエラーが発生した場合は、 CDaoException:: GetErrorCountから返されたエラーの数に基づいて、DAO の errors コレクションをループすることができます。In the rare case when you are using an ODBC data source and there are multiple errors, you can loop through DAO's Errors collection based on the number of errors returned by CDaoException::GetErrorCount. ループを実行するたびに、 CDaoException:: GetErrorInfo を呼び出して m_pErrorInfo データメンバーを補充します。Each time through the loop, call CDaoException::GetErrorInfo to refill the m_pErrorInfo data member.

関連項目See also

例外処理Exception Handling