例外処理 : データベースの例外
この技術情報では、データベースの例外を処理する方法を説明します。この技術情報のマテリアルのほとんどは、 ODBC (Open Database Connectivity)の MFC クラスまたはデータ アクセス オブジェクト (DAO) の MFC クラスを使用しているかどうかを適用します。1 回または他のモデルへの素材の仕様は明示的にマークされます。ここでは、次の内容について説明します。
例外処理への方法
データベースの例外処理の例
例外処理への方法
アプローチは DAO や ODBC を使用している場合でも同じです。
処理の例外状態に例外ハンドラーを常に記述する必要があります。
以外のデータベースの例外に最も実際的な方法は、例外のシナリオでアプリケーションをテストします。コードの操作に発生する可能性のあると判断し発生する例外を強制します。高い例外をスローします。これにより、例外が表示するには、スロー、またはデバッガーから返されたエラー情報を調べるかを調べるトレース出力が。これは、戻りコードを、使用する例外のシナリオに表示されるかを通知します。
ODBC の例外に使用するエラー コード
フレームワークで定義したフォーム AFX_SQL_ERROR_XXX名があり、戻りコードに加えて、 CDBExceptions は ODBC(D) の戻りコードに基づいています。このような例外の戻りコードにフォーム SQL_ERROR_XXXの名前があります。
戻り CDBExceptionコードは、クラスの m_nRetCode のデータ メンバーの下に、フレームワーク定義され、 ODBC 定義されている —返すデータベース クラスができる説明します。ODBC によって定義される戻りコードに関する追加情報については、 MSDN ライブラリの " ODBC Programmer's Reference " で使用できます。
DAO 例外に使用するエラー コード
DAO 例外の場合、詳細については、一般に使用できます。CDaoException のキャッチされたオブジェクトの 3 人のデータ メンバーを介してエラー情報にアクセスできます:
m_pErrorInfo はデータベースに関連付けられた DAO のエラー オブジェクトのコレクションのエラー情報をカプセル化する CDaoErrorInfo のオブジェクトへのポインターが格納されます。
m_nAfxDaoError は MFC DAO クラスから拡張エラー コードが含まれています。フォーム AFX_DAO_ERROR_XXXの名前が、これらのエラー コードは CDaoExceptionのデータ メンバーの下で説明します。
m_scode は DAO の OLE SCODE を、 ViewState が含まれています。しかし、このエラー コードを使用する必要はありません。通常詳細については、他の 2 種類のデータ メンバーで使用できます。SCODE 値に関する詳細については、データ メンバーを参照してください。
DAO エラー、 DAO のエラー オブジェクトおよびオブジェクトの種類 DAO のエラー コレクションに関する追加情報はクラス CDaoExceptionの下で使用できます。
データベースの例外処理の例
次の例は CRecordset- new の演算子を使って、ヒープの派生オブジェクト)を作成し、にレコードセットを開こうとします (ODBC データ ソースの場合)。DAO クラスの類似の例では、 「DAO 例外例」を参照してください。
ODBC の例外の例
開く(&&O),開く,[開く] のメンバー関数は try ブロックとの呼び出し 開く(&&O),開く,[開く] の例外 (ODBC クラスの型 CDBException )ため、このコード角かっこがスローされる可能性があります。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 ODBC を使用している場合 (.mdb)データベースを使用している場合、ほとんどの場合、 1 台のエラー オブジェクトがあります。まれなケースでは、 ODBC データ ソースを使用し、複数のエラーがあると、 CDaoException::GetErrorCountによって返されるエラーの数に基づいて DAO のエラー コレクションを反復処理できます。ループを使用して、 m_pErrorInfo のデータ メンバーを再設定する CDaoException::GetErrorInfo をダイヤルするたび。