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 A のレコードセット。レコードのメンバーシップおよび手順を決定できないレコードセットを開くが、他のユーザーによるデータ値の変更は一目でとフェッチ操作に従います。ダイナセットは、キーセット ドリブンのレコードセットです。
双方向のスクロールのCRecordset::snapshot A の静的なレコードセット。レコードセットを開くとレコードのメンバーシップおよび手順を決定されます。; データ値は、レコードがフェッチするときに決定されます。他のユーザーが行った変更がレコードセットが閉じてから再度開くまで表示されません。
双方向のスクロールのCRecordset::dynamic A のレコードセット。他のユーザーが行ったメンバーシップの変更は、順序付け、データ値一目でフェッチ操作に従います。多くの ODBC ドライバーがこのレコードセットの型をサポートしないことに注意してください。
前方スクロール専用のCRecordset::forwardOnly A の読み取り専用レコードセット。
CRecordsetの場合、既定値は CRecordset::snapshotです。既定では、異なる既定値を持つ Visual C++ ウィザードが CRecordset ODBC と DAO の両方 CDaoRecordsetと対話できるようにします。
これらのレコードセットの型の詳細については、" " レコードセット (ODBC)を参照してください。関連情報については、「 Windows SDKブロックとスクロール可能なカーソル」を使用して" "を参照してください。
注意 要求された型がサポートされていない場合、フレームワークは例外をスローします。
lpszSQL
次のいずれかを含む文字列のポインター:null のポインター。
テーブル名
SQL の select の SQL ステートメント (省略可 WHERE か ORDER BY の句と)。
定義済みクエリ (ストアド プロシージャ) の名前を指定する call のステートメント。左中かっこと call のキーワード間の空白を挿入することに注意してください。
この文字列に関する詳細については、"解説"で ClassWizard ロールのテーブルと説明を参照してください。
[!メモ]
は、結果セットの列の順序はオーバーライド RFX の順序 DoFieldExchange かまたは DoBulkFieldExchange の関数の Bulk RFX 関数に一致する必要があります。
dwOptions
値の組み合わせを指定できることを示します。これらの一部は相互に排他的です。既定値は none です。CRecordset::none 設定するオプションはありません。このパラメーター値は、他のすべての値と同時には指定できません。既定では、レコードセットは [編集] か [削除] で更新できます。AddNewに新しいレコードを追加できるようにします。Updatability は、データ ソースによって異なります nOpenType、またはオプションで指定します。バルク追加の最適化は使用できません。バルク行フェッチが実装されていません。削除したレコードがレコードセットの移動中にとばされません。ブックマークは使用できません。自動ダーティなフィールドのチェックが実行されます。
CRecordset::appendOnly は、レコードセットの [編集] か [削除] はできません。割り当て AddNew だけです。このオプションは CRecordset::readOnlyと同時には指定できません。
CRecordset::readOnly が読み取り専用としてレコードセット。このオプションは CRecordset::appendOnlyと同時には指定できません。
大量のレコードを同時に追加CRecordset::optimizeBulkAdd の 使用を最適化する準備した SQL ステートメント。レコードセットを更新するために ODBC API 関数 SQLSetPos を使用しない場合にのみ適用されます。最初の更新でマークされているフィールドが変更されているかを判定します。このオプションは CRecordset::useMultiRowFetchと同時には指定できません。
複数の行が単一のフェッチ操作で取得するためのフェッチCRecordset::useMultiRowFetch のバルク行。これによって、パフォーマンスが向上するようにデザインされている高度な機能です; ただし、バルク レコード フィールド エクスチェンジは ClassWizard によってサポートされていません。このオプションは CRecordset::optimizeBulkAddと同時には指定できません。CRecordset::useMultiRowFetchを指定することに注意してください CRecordset::noDirtyFieldCheck が自動的に選択されます (ダブル バッファリングは使用できません) ; 前方スクロール専用レコードセットで、選択 CRecordset::useExtendedFetch が自動的に有効になります。バルク行フェッチに関する詳細については、" " レコードセット: フェッチ サイズのレコードを (ODBC)を参照してください。
レコードセット内を移動するときにCRecordset::skipDeletedRecords のスキップすべての削除されたレコード。これは、特定の相対フェッチのパフォーマンスが低下します。このオプションは、前方スクロール専用レコードセットでは無効です。0、および CRecordset::skipDeletedRecords オプションの設定セットを呼び出すと、nRows のパラメーターの [移動][移動] はアサートします。削除された行がレコードセットから削除されることを CRecordset::skipDeletedRecords が ドライバーのパッキングに似た、つまりことに注意してください。ただし、ドライバーがレコードを詰めれば、削除するレコードのみをスキップします; これは、レコードセットが開いている間、他のユーザーが削除したレコードをバイパスされません。CRecordset::skipDeletedRecords は、他のユーザーが削除した行をスキップします。
CRecordset::useBookmarks 5 年 1 月の使用はレコードセットでサポートされている場合、ブックマーク。ブックマークの後のデータの取得は、データの移動のパフォーマンスが向上します。前方スクロール専用レコードセットとなります。詳細については、" " レコードセット: ブックマークと絶対位置 (ODBC)を参照してください。
CRecordset::noDirtyFieldCheck は、ダーティ フィールドのチェックをオフにします (ダブル バッファリング)。これはパフォーマンスを向上します; ただし、SetFieldDirty と SetFieldNull のメンバー関数を呼び出して、ダーティとして手動でフィールドを付ける必要があります。クラス CRecordset のダブル バッファリングをクラス CDaoRecordsetのダブル バッファリングに似ていることに注意してください。ただし、CRecordsetで、個々のフィールドのダブル バッファリングを有効にできません; すべてのフィールドのコントロールを有効またはすべてのフィールドに対して無効にします。選択 CRecordset::useMultiRowFetchを指定することに注意してください CRecordset::noDirtyFieldCheck が自動的に挿入; ただし、SetFieldDirty と SetFieldNull は、バルク行フェッチを実装しているレコードセットで使用できません。
CRecordset::executeDirect は準備した SQL ステートメントを使用しません。パフォーマンスを向上させるには、[再クエリ] のメンバー関数が呼び出されていない場合は、このオプションを指定します。
SQLFetchの代わりにCRecordset::useExtendedFetch の実装 SQLExtendedFetch。これは、前方スクロール専用レコードセットにバルク行フェッチを実装するために設計されています。前方スクロール専用レコードセットで選択 CRecordset::useMultiRowFetch を指定すると、CRecordset::useExtendedFetch が自動的に有効になります。
CRecordset::userAllocMultiRowBuffers は、ユーザー データの記憶領域のバッファーを割り当てます。独自のストレージを割り当てる場合は CRecordset::useMultiRowFetch とともにこのオプションを使用してください; それ以外の場合、フレームワークは自動的に必要なストレージを割り当てます。詳細については、" " レコードセット: フェッチ サイズのレコードを (ODBC)を参照してください。CRecordset::useMultiRowFetch を指定せずに CRecordset::userAllocMultiRowBuffers を指定することになります。アサーション エラーが表示されます。
戻り値
CRecordset のオブジェクトが正常に開いた場合、; 呼び出された場合は (0) CDatabase::Open は 0 を返します。
解説
レコードセットによって定義されるクエリを実行するには、このメンバー関数を呼び出す必要があります。**[開く]**を呼び出す前に、レコードセット オブジェクトを構築する必要があります。
データ ソースへの接続はこのレコードセットの **[開く]**またはを呼び出す前に、レコードセットを構築するときによって異なります。データ ソースに接続されていないレコードセットのコンストラクターに CDatabase のオブジェクトを渡した場合、このメンバー関数は、データベース オブジェクトを開こうとしたときに GetDefaultConnect を使用します。レコードセットのコンストラクターにを渡すと null データベース オブジェクトを接続する、コンストラクターは、の CDatabase のオブジェクト、および [開く] 操作を構築します。これらのさまざまな条件下のレコードセットと接続を閉じる方法の詳細については、[閉じる]を参照してください。
[!メモ]
CRecordset のオブジェクトを使用してデータ ソースへのアクセスは常に共有されます。CDaoRecordset のクラスとは異なり、排他アクセスを持つデータ ソースを開くために CRecordset のオブジェクトを使用できません。
**[開く]**を呼び出すと、クエリの select 通常、SQL のステートメントは、次の表に示す条件に基づいてレコードを選択します。
lpszSQL パラメーターの値 |
選択されたレコードが決定されます。 |
例 |
---|---|---|
NULL |
The string GetDefaultSQLで返しました。 |
|
SQL テーブル名 |
DoFieldExchange または DoBulkFieldExchangeテーブルの一覧のすべての列。 |
"Customer" |
定義済みクエリ (ストアド プロシージャ) の名前 |
列が返されるようにクエリ定義されます。 |
"{call OverDueAccts}" |
select の列の一覧 FROM テーブルの一覧 |
指定したテーブルの指定した列。 |
"SELECT CustId, CustName FROM Customer" |
注意 |
---|
、SQL 文字列の追加の空白を挿入することに注意してください。たとえば、左中かっこと call のキーワード間の空白を挿入、MFC はテーブル名として SQL 文字列を作成し、この例外が発生する select のステートメントに組み込まれています。同様に、定義済みクエリが出力パラメーターを使用する場合は、挿入の中かっこの間の空白を「"に置き換えられます。シンボル。最後に、call のステートメントの中かっこまたは select のステートメントの select のキーワードの前に空白を挿入する必要があります。 |
通常の手順では [開く]に null を渡すことです; この場合、[開く] の呼び出し GetDefaultSQL。CRecordset の派生クラスを使用すると、GetDefualtSQL は、ClassWizard で指定したテーブルの名前を示します。lpszSQL のパラメーターではなく情報を指定できます。
渡すとは関係なく、[開く] 構成体は、クエリの最終的な SQL 文字列 (SQL 文字列は WHERE がある場合は、lpszSQL に追加される ORDER BY の句で渡された文字列にしたり、)、クエリを実行します。GetSQL を呼び出して **[開く]**を呼び出した後に構築された文字列を確認できます。詳細については、レコードセットの動作に関する SQL ステートメントの構築、レコードを選択するか レコードセット: レコードセットがレコードを選択する (ODBC) を、" "を参照してください。
クラスのレコードセットのフィールド データ メンバーは選択されたデータの列にバインドされます。レコードが返されると、先頭のレコードが現在のレコードになります。
レコードセットの選択を、フィルターまたは並べ替えなど) を設定する場合は、レコードセット オブジェクトの構築後、**[開く]**を呼び出す前にこれらを指定します。レコードセットが既に開いた後のレコードセットのレコードを更新するには、[再クエリ]を呼び出します。
詳細については、追加の例を示して、" " レコードセット (ODBC)、レコードセット: レコードセットがレコードを選択する (ODBC) をと レコードセット: 作成と破棄 (ODBC) をを参照してください。
例外
このメソッドは、型 CDBException* と **CMemoryException***の例外をスローできます。
使用例
[開く] の呼び出しを次のコード例の異なる形式。
// 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();
必要条件
Header: afxdb.h