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)」を参照してください。
注意 : 要求した形式がサポートされていないと、フレームワークは例外をスローします。
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 自動的なダーティ フィールド チェック (ダブル バッファリング) をオフにします。パフォーマンスは向上しますが、SetFieldDirty と SetFieldNull メンバ関数を呼び出して手動でフィールドにマークする必要があります。CRecordset クラスのダブル バッファリングは、CDaoRecordset クラスのダブル バッファリングに似ています。しかし CRecordset では、個別のフィールドでダブル バッファリングを有効にはできません。全フィールドに対して有効にするか、無効にするかのどちらかです。CRecordset::useMultiRowFetch を指定すると CRecordset::noDirtyFieldCheck が自動的にオンになります。しかし、SetFieldDirty と SetFieldNull は、バルク行フェッチを実装したレコードセットには使用できません。
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