次の方法で共有


CDaoRecordset::Open

更新 : 2007 年 11 月

レコードセットにレコードを取得するには、この関数を呼び出す必要があります。

virtual void Open(
   int nOpenType = AFX_DAO_USE_DEFAULT_TYPE,
   LPCTSTR lpszSQL = NULL,
   int nOptions = 0 
);
virtual void Open(
   CDaoTableDef* pTableDef,
   int nOpenType = dbOpenTable,
   int nOptions = 0 
);
virtual void Open(
   CDaoQueryDef* pQueryDef,
   int nOpenType = dbOpenDynaset,
   int nOptions = 0 
);

パラメータ

  • nOpenType
    次のいずれかの値です。

    • dbOpenDynaset   双方向スクロールのダイナセット タイプのレコードセット。これは、既定の設定です。

    • dbOpenTable   双方向スクロールのテーブル タイプのレコードセット。

    • dbOpenSnapshot   双方向スクロールのスナップショット タイプのレコードセット。

  • lpszSQL
    次の値の 1 つを持つ文字列へのポインタ。

    • NULL ポインタ。

    • 1 つ以上のテーブル定義名とクエリ定義名、またはどちらか一方 (コンマ区切り)。

    • SQL SELECT ステートメント (SQL の WHERE 句または ORDER BY 句を伴うこともあります)。

    • パススルー クエリ。

  • nOptions
    次に示すオプションを 1 つ以上指定できます。既定値は 0 です。指定できる値は次のとおりです。

    • dbAppendOnly   新しいレコードだけ追加できます (ダイナセット タイプのレコードセットのみ)。実際、このオプションはレコードが追加のみされることを示します。MFC ODBC データベース クラスには、レコードを取得できたり、追加できたりする追加専用のオプションが用意されています。

    • dbForwardOnly   レコードセットは、前方スクロール専用のスナップショットです。

    • dbSeeChanges   編集中のデータを別のユーザーが変更すると、例外を生成します。

    • dbDenyWrite   ほかのユーザーはレコードを変更または追加できません。

    • dbDenyRead   ほかのユーザーはレコードを参照できません (テーブル タイプのレコードセットのみ)。

    • dbReadOnly   レコードの表示だけができます。レコードを変更できるのは、ほかのユーザーです。

    • dbInconsistent   一貫性を持たない更新が許可されます (ダイナセット タイプのレコードのみ)。

    • dbConsistent   一貫性を持つ更新のみ許可されます (ダイナセット タイプのレコードのみ)。

    a180s50e.alert_note(ja-jp,VS.90).gifメモ :

    定数 dbConsistentdbInconsistent は、相互に排他的です。Open の指定したインスタンスではどちらか一方を使用し、両方を使用することはできません。

  • pTableDef
    CDaoTableDef オブジェクトへのポインタを返します。このバージョンは、テーブル タイプのレコードセットだけで有効です。このオプションを使用するときは、CDaoRecordset を構築するときに使用する CDaoDatabase ポインタは使用せずに、テーブル定義があるデータベースを使用します。

  • pQueryDef
    CDaoQueryDef オブジェクトへのポインタを返します。この指定はダイナセット タイプのレコードセット、またはスナップショット タイプのレコードセットでのみ有効です。このオプションを使用するときは、CDaoRecordset を構築するときに使用する CDaoDatabase ポインタは使用せずに、クエリ定義があるデータベースを使用します。

解説

Open 関数を呼び出す前に、レコードセット オブジェクトを作成する必要があります。これにはいくつかの方法があります。

  • レコードセット オブジェクトを構築するとき、既に開かれている CDaoDatabase オブジェクトへのポインタを渡します。

  • レコードセット オブジェクトを構築するとき、開かれていない CDaoDatabase オブジェクトへのポインタを渡します。レコードセットは、CDaoDatabase オブジェクトを開きますが、レコードセット オブジェクトを閉じるときに、このオブジェクトを閉じません。

  • レコードセット オブジェクトを構築するとき、NULL ポインタを渡します。レコードセット オブジェクトは GetDefaultDBName を呼び出して、開く Microsoft Access の .MDB ファイルの名前を取得します。レコードセットは、CDaoDatabase オブジェクトを開きます。このオブジェクトはレコードセットが開かれている間開いたままになります。レコードセットの Close を呼び出すと、CDaoDatabase オブジェクトも閉じます。

    a180s50e.alert_note(ja-jp,VS.90).gifメモ :

    レコードセットが CDaoDatabase オブジェクトを開くときは、非排他アクセスでデータ ソースを開きます。

パラメータ lpszSQL を使用する形式の Open では、一度レコードセットを開いておけば、いくつかの方法でレコードを取得できます。最初の方法は、DoFieldExchange に DFX 関数を使用することです。2 番目の方法は、GetFieldValue メンバ関数を呼び出して動的連結を使用することです。これらの方法は組み合わせて、または個別に実装できます。組み合わせたときは、Open の呼び出しに SQL ステートメントを渡す必要があります。

CDaoTableDef オブジェクトを渡す 2 番目の形式の Open を使用すると、結果列は、DoFieldExchange と DFX 機構を使用する連結のほか、GetFieldValue を使用した動的な連結もできるようになります。

a180s50e.alert_note(ja-jp,VS.90).gifメモ :

テーブル タイプのレコードセットでは、CDaoTableDef オブジェクトを使用する Open だけを呼び出すことができます。

CDaoQueryDef オブジェクトを渡す 3 番目の形式の Open を使用すると、そのクエリが実行され、結果列は、DoFieldExchange と DFX 機構を使用した連結、または GetFieldValue を使用した動的な連結ができるようになります。

a180s50e.alert_note(ja-jp,VS.90).gifメモ :

ダイナセット タイプのレコードセットとスナップショット タイプのレコードセットでは、CDaoQueryDef オブジェクトを使用する Open だけを呼び出すことができます。

パラメータ lpszSQL を使用する最初の形式の Open では、次の表で示された条件を基にレコードを選択します。

パラメータ lpszSQL の値

レコードが選択される条件

NULL

GetDefaultSQL が返す文字列

 

1 つ以上のテーブル定義またはクエリ定義のコンマ区切りのリスト

DoFieldExchange で表現されているすべての列

"Customer"

SELECT 列リスト FROM テーブル リスト

指定されたテーブル、またはクエリ定義からの、指定された列

"SELECT CustId, CustName

FROM Customer"

通常は、OpenNULL を渡します。この場合、OpenGetDefaultSQL を呼び出し、その値は、CDaoRecordset 派生クラスを生成しているときに、ClassWizard が生成するオーバーライド可能なメンバ関数になります。この値は、ClassWizard で指定したテーブル定義またはクエリ定義 (あるいはその両方) の名前を指定します。代わりに、その他の情報を lpszSQL パラメータに指定することもできます。

何を渡しても、Open はクエリで使用する最終的な SQL 文字列 (この文字列には、lpszSQL に渡した文字列に SQL の WHERE 句および ORDER BY 句を追加したものも使用できます) を生成し、その後そのクエリを実行します。Open の呼び出し後 GetSQL を呼び出すことにより、生成された SQL ステートメントをチェックできます。

レコードセット クラスのフィールド データ メンバは、選択されたデータの列に連結されます。複数のレコードが返されたときは、先頭のレコードが現在のレコードになります。

フィルタや並べ替えなどのレコードセットのオプションを設定するには、レコードセット オブエジェクトを構築後、Open を呼び出す前に、m_strSort または m_strFilter を設定します。レコードセットが既に開かれているとき、レコードセットのレコードを再表示するときは、Requery 関数を呼び出します。

ダイナセット タイプのレコードセットまたはスナップショット タイプのレコードセットの Open を呼び出した場合、あるいは SQL ステートメントまたはデータ ソースが接続されたテーブルを表すテーブル定義を参照している場合は、型引数に dbOpenTable を使用できません。dbOpenTable を指定すると、MFC は例外をスローします。テーブル定義オブジェクトが接続されたテーブルを表しているかどうかを調べるには、CDaoTableDef オブジェクトを作成し、その GetConnect メンバ関数を呼び出します。

レコードを編集または削除しているときに、ほかのユーザーまたはほかのプログラムが同じレコードに対して行う変更をトラップするときは、dbSeeChanges フラグを使用します。たとえば、2 人のユーザーが同じレコードの編集を始めると、最初に Update メンバ関数を呼び出したユーザーが成功します。2 人目のユーザーが Update を呼び出すと、CDaoException がスローされます。同じように、2 人目のユーザーがレコードを削除するために Delete を呼び出そうとするときに、そのレコードを最初のユーザーが既に変更していると CDaoException が発生します。

通常、更新中にこの CDaoException が返されたら、そのフィールドの内容を更新して、新しく変更された値を取得する必要があります。削除処理中に例外が発生したら、新しいレコード データを表示して、データが最近変更されたことを示すメッセージを表示するようにもできます。この時点で、ユーザーがそれでもレコードを削除するかどうかの確認を求めることができます。

a180s50e.alert_note(ja-jp,VS.90).gifヒント :

アプリケーションが ODBC データ ソースから開かれたレコードセットに対して一度しか処理を行わないときは、パフォーマンスを向上させるために前方スクロール専用 (dbForwardOnly) オプションを使用します。

関連情報については、DAO ヘルプの「OpenRecordset Method」を参照してください。

必要条件

ヘッダー : afxdao.h

参照

参照

CDaoRecordset クラス

階層図

CDaoRecordset::Close

CDaoRecordset::CDaoRecordset

その他の技術情報

CDaoRecordset のメンバ