CRecordset::Open

更新 : 2007 年 11 月

テーブルを取得すること、またはレコードセットを表すクエリを実行することによって、レコードセットを開きます。

virtual BOOL Open( 
   UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, 
   LPCTSTR lpszSQL = NULL, 
   DWORD dwOptions = none  
);

パラメータ

  • nOpenType
    既定値 AFX_DB_USE_DEFAULT_TYPE を受け入れます。または、次に示す enum OpenType のうちの 1 つを指定します。

    • CRecordset::dynaset 双方向にスクロールできるレコードセット。レコードのメンバシップと順番は、レコードセットが開かれたときに決定されますが、別のユーザーによるデータ値への変更は、次のフェッチ操作の後で表示されます。ダイナセットは、キーセット ドリブン レコードセットとしても知られています。

    • CRecordset::snapshot   双方向にスクロールできる静的レコードセット。レコードのメンバシップと順番は、レコードセットが開かれたときに決定されます。データ値はレコードがフェッチされたときに決定されます。別のユーザーによる変更は、レコードセットを閉じて次に開かれるまで表示されません。

    • CRecordset::dynamic   双方向にスクロールできるレコードセット。別のユーザーによるメンバシップ、順序、および値への変更は、次のフェッチ操作の後で表示されます。ODBC ドライバの多くは、この種類のレコードセットをサポートしていません。

    • CRecordset::forwardOnly   前方スクロールだけできる読み込み専用レコードセット

      CRecordset では、既定値は CRecordset::snapshot です。既定値機構を使うと、Visual C++ ウィザードは違った既定値を持つ ODBC CRecordset と DAO CDaoRecordset の両方と相互作用します。

    これらのレコードセットのタイプの詳細については、「レコードセット (ODBC)」を参照してください。関連する情報については、『ODBC Programmer's Reference』の「Chapter 11: Retrieving Results (Advanced)」を参照してください。

    1hkkwdf0.alert_caution(ja-jp,VS.90).gif注意 :

    要求した形式がサポートされていないと、フレームワークは例外をスローします。

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

    • NULL ポインタ。

    • テーブル名

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

    • 組み込みクエリ (組み込み手続き) の名前を指定する CALL ステートメント。中かっこと CALL キーワードの間にスペースを入れることはできません。

    この文字列の詳細については、解説中の表と ClassWizard の役割を参照してください。

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

    結果セットの列の順番は、DoFieldExchange または DoBulkFieldExchange 関数オーバーライドの RFX または Bulk RFX 関数呼び出しの順番に一致している必要があります。

  • dwOptions
    次に示す値を組み合わせて指定するビットマスクです。これらのいくつかは相互に排他的です。既定値は、none です。

    • CRecordset::none   オプションを設定しません。このパラメータ値は、ほかのすべての値と相互に排他的です。既定では、Edit 関数や Delete 関数を使ってレコードセットを更新できます。さらに、AddNew 関数を使ってレコードを追加できます。更新できるかどうかは、指定した nOpenType オプションだけでなくデータ ソースにも依存します。バルク追加の最適化はできません。バルク行フェッチは実装されません。削除されたレコードは、レコードセットのカーソル移動においてスキップされません。ブックマークは使用できません。自動ダーティ フィールド チェックは実装されています。

    • CRecordset::appendOnly   レコードセットに Edit 関数や Delete 関数は使用できません。AddNew 関数を使った追加だけができます。このオプションは CRecordset::readOnly と相互に排他的です。

    • CRecordset::readOnly   レコードセットを読み込み専用で開きます。このオプションは CRecordset::appendOnly と相互に排他的です。

    • CRecordset::optimizeBulkAdd   準備されている SQL ステートメントを使って、多数のレコードの同時追加を最適化します。ODBC API の関数 SQLSetPos を使ってレコードセットを更新していないときだけ、適用されます。最初の更新により、どのフィールドがダーティとしてマークされているかが調べられます。このオプションは CRecordset::useMultiRowFetch と相互に排他的です。

    • CRecordset::useMultiRowFetch   1 回のフェッチ操作で複数行を取得するために、バルク行フェッチを実装します。これは、パフォーマンスを向上するためにデザインされた高度な機能ですが、バルク レコード フィールド エクスチェンジは ClassWizard ではサポートされていません。このオプションは CRecordset::optimizeBulkAdd と相互に排他的です。CRecordset::useMultiRowFetch を指定した場合は、CRecordset::noDirtyFieldCheck オプションも自動的にオンになり、ダブル バッファリングが無効になります。前方参照だけのレコードセットの場合、CRecordset::useExtendedFetch は自動的にオンになります。バルク行フェッチの詳細については、「レコードセット : バルク行フェッチ (ODBC)」を参照してください。

    • CRecordset::skipDeletedRecords   レコードセット内をカーソル移動するとき、削除したレコードをすべてスキップします。特定の相対フェッチでは、パフォーマンスが低下します。このオプションは、前方参照だけのレコードセットでは無効です。nRows パラメータを 0 に設定し、CRecordset::skipDeletedRecords オプションを設定して Move を呼び出すと、Move はアサートします。CRecordset::skipDeletedRecords は、削除された行をレコードセットから除去することを意味する "ドライバによるパック" に類似しています。しかし、ドライバがレコードをパックする場合は、自分で削除したレコードだけをスキップします。レコードセットが開かれている間は、別のユーザーが削除したレコードはスキップしません。CRecordset::skipDeletedRecords は、別のユーザーによって削除された行もスキップします。

    • CRecordset::useBookmarks   サポートされていれば、レコードセットのブックマークを使用します。ブックマークによりデータ取得は遅くなりますが、データのカーソル移動処理のパフォーマンスは上がります。前方参照だけのレコードセットでは、無効です。詳細については、「レコードセット : ブックマークと絶対位置 (ODBC)」を参照してください。

    • CRecordset::noDirtyFieldCheck   自動的なダーティ フィールド チェック (ダブル バッファリング) をオフにします。パフォーマンスは向上しますが、SetFieldDirtySetFieldNull メンバ関数を呼び出して手動でフィールドにマークする必要があります。CRecordset クラスのダブル バッファリングは、CDaoRecordset クラスのダブル バッファリングに似ています。しかし CRecordset では、個別のフィールドでダブル バッファリングを有効にはできません。全フィールドに対して有効にするか、無効にするかのどちらかです。CRecordset::useMultiRowFetch を指定すると CRecordset::noDirtyFieldCheck が自動的にオンになります。しかし、SetFieldDirtySetFieldNull は、バルク行フェッチを実装したレコードセットには使用できません。

    • CRecordset::executeDirect   準備されている SQL ステートメントを使用しません。Requery メンバ関数が呼び出されない場合は、パフォーマンスを上げるにはこのオプションを指定します。

    • CRecordset::useExtendedFetch   SQLFetch の代わりに SQLExtendedFetch を実装します。これは、前方参照だけのレコードセットにバルク行フェッチを実装するために、デザインされています。前方参照だけのレコードセットに CRecordset::useMultiRowFetch オプションを指定した場合、CRecordset::useExtendedFetch は自動的にオンになります。

    • CRecordset::userAllocMultiRowBuffers   ユーザーがデータの記憶バッファを割り当てます。独自の記憶場所を割り当てる場合は、CRecordset::useMultiRowFetch と組み合わせてこのオプションを使用します。それ以外の場合は、フレームワークが必要な記憶場所を自動的に割り当てます。詳細については、「レコードセット : バルク行フェッチ (ODBC)」を参照してください。CRecordset::useMultiRowFetch を指定しないで CRecordset::userAllocMultiRowBuffers を指定すると、アサートします。

戻り値

CRecordset オブジェクトを開くことができた場合は 0 以外を返します。CDatabase::Open (もし呼び出されていれば) が 0 を返した場合は 0 を返します。

解説

レコードセットが定義しているクエリを実行します。Open 関数を呼び出す前に、レコードセット オブジェクトを作成する必要があります。

データ ソースへのレコードセットの接続は、Open 関数を呼び出す前のレコードセットの作成方法に依存します。データ ソースに接続していない CDatabase オブジェクトをレコードセットのコンストラクタに渡すと、このメンバ関数はデータベース オブジェクトを開くために GetDefaultConnect 関数を使います。レコードセット コンストラクタに NULL を渡すと、コンストラクタは CDatabase オブジェクトを構築し、Open 関数はデータベース オブジェクトを接続します。レコードセットのクローズと、さまざまな接続環境の詳細についての説明は Close 関数を参照してください。

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

CRecordset オブジェクトによるデータ ソースへのアクセスは、常に共有モードです。CDaoRecordset クラスとは異なり、CRecordset オブジェクトを使って排他アクセスでデータ ソースを開くことはできません。

Open 関数を呼び出すとき、クエリ (通常は SQL SELECT ステートメント) は次の表に示す条件を基準としてレコードを選択します。

lpszSQL パラメータの値

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

NULL

GetDefaultSQL が返す文字列

 

SQL テーブル名

DoFieldExchange または DoBulkFieldExchange のテーブル リストのすべての列

"Customer"

組み込みクエリ (組み込み手続き) 名

クエリが値を返すために定義された列

"{call OverDueAccts}"

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

指定したテーブルの指定した列

"SELECT CustId, CustName FROM

Customer"

1hkkwdf0.alert_caution(ja-jp,VS.90).gif注意 :

SQL 文字列に余分なホワイト スペースを入れないように注意してください。たとえば、中かっこと CALL キーワードの間にスペースを挿入した場合、MFC は SQL 文字列をテーブル名と間違えて SELECT ステートメントに組み込むため、例外がスローされることになります。同様に、定義済みクエリが出力パラメータを使用する場合は、中かっこと '?' マークの間にスペースを入れることはできません。CALL ステートメントの中かっこの前、または SELECT ステートメントの SELECT キーワードの前にもスペースを入れることはできません。

通常のプロシージャでは Open 関数に NULL を渡します。このとき Open 関数は GetDefaultSQL を呼び出します。CRecordset 派生クラスを使用している場合、GetDefualtSQL は ClassWizard で指定したテーブル名を与えます。代わりに、その他の情報を lpszSQL パラメータに指定することもできます。

何を渡したとしても、Open 関数はクエリの最終的な SQL 文字列 (文字列は、lpszSQL 文字列に渡した文字列に加えて SQL の WHERE 句と ORDER BY 句を持っていてもかまいません) を作成し、クエリを実行します。Open 関数を呼び出した後に GetSQL 関数を呼び出して作成された文字列を調べることができます。レコードセットがどのように SQL ステートメントを作成し、レコードを選択するかの詳細については、「レコードセット : レコード選択のしくみ (ODBC)」を参照してください。

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

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

例を含めた詳細については、「レコードセット (ODBC)」、「レコードセット : レコード選択のしくみ (ODBC)」、「レコードセット : レコードセットの生成と破棄 (ODBC)」を参照してください。

例外

このメソッドは、CDBException* 型の例外と CMemoryException* 型の例外をスローできます。

使用例

次の例では、Open 呼び出しのさまざまな形式を示します。

// rsSnap, rsLName, and rsDefault are CRecordset or CRecordset-derived 
// objects

// Open rs using the default SQL statement, implement bookmarks, and turn 
// off automatic dirty field checking
rsSnap.Open(CRecordset::snapshot, NULL, CRecordset::useBookmarks | 
   CRecordset::noDirtyFieldCheck);

// Pass a complete SELECT statement and open as a dynaset
rsLName.Open(CRecordset::dynaset, _T("Select L_Name from Customer"));

// Accept all defaults
rsDefault.Open();

必要条件

ヘッダー : afxdb.h

参照

参照

CRecordset クラス

階層図

CRecordset::CRecordset

CRecordset::Close

CRecordset::GetDefaultSQL

CRecordset::GetSQL

CRecordset::m_strFilter

CRecordset::m_strSort

CRecordset::Requery

その他の技術情報

CRecordset のメンバ