次の方法で共有


CRecordset::Open

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

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)」を参照してください。 関連する情報については、Windows SDK の「Using Block and Scrollable Cursors」を参照してください。

    ヒント

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

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

    • NULL ポインター。

    • テーブル名

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

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

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

    注意

    結果セットの列の順番は、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 関数を参照してください。

注意

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

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

lpszSQL パラメーターの値

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

NULL

GetDefaultSQL が返す文字列

 

SQL テーブル名

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

"Customer"

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

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

"{call OverDueAccts}"

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

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

"SELECT CustId, CustName FROM

Customer"

ヒント

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 のメンバー