次の方法で共有


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 の次のいずれかの値を使用します。

    • 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
    次のいずれかを含む文字列ポインター:

    • 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   自動ダーティ フィールド チェック (ダブル バッファリング) を無効にします。  これにより、パフォーマンスは向上しますが、SetFieldDirty メンバー関数と SetFieldNull メンバー関数を呼び出して手動でフィールドをダーティとしてマークする必要があります。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 オブジェクトが正常に開いた場合はゼロ以外、それ以外の場合、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 キーワードの前に空白を挿入しないでください。  

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

渡す値に関係なく、Open はクエリの最終的な SQL 文字列 (この文字列は、渡した lpszSQL 文字列に SQL WHERE 句または ORDER BY 句が追加された文字列になる可能性があります) を作成し、クエリを実行します。  Open を呼び出した後に GetSQL を呼び出して、作成された文字列を確認できます。  レコードセットによる SQL ステートメントの作成方法とレコードの選択方法の詳細については、「レコードセット: レコード選択のしくみ (ODBC)」を参照してください。  

レコードセット クラスのフィールド データ メンバーは、選択したデータの列に結び付けられています。  いくつかのレコードが返された場合、最初のレコードが現在のレコードになります。  

フィルター、並べ替えなどのオプションをレコードセットに設定する場合は、レコードセット オブジェクトを作成した後で、Open を呼び出す前にオプションを指定します。  レコードセットが既に開いている状態でレコードセットのレコードを更新するには、Requery を呼び出します。  

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

例外

Exception

Condition

このメソッドは、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