CRecordset
クラス
データ ソースから選択された 1 組のレコードセットを表現します。
構文
class CRecordset : public CObject
メンバー
パブリック コンストラクター
名前 | 説明 |
---|---|
CRecordset::CRecordset |
CRecordset オブジェクトを構築します。 派生クラスは、これを呼び出すコンストラクターを提供する必要があります。 |
パブリック メソッド
名前 | 説明 |
---|---|
CRecordset::AddNew |
新しいレコードを追加する準備をします。 呼び出 Update して追加を完了します。 |
CRecordset::CanAppend |
メンバー関数を使用してレコードセットに新しいレコードを追加できる場合は、0 以外の値を AddNew 返します。 |
CRecordset::CanBookmark |
レコードセットがブックマークをサポートしている場合は、0 以外の値を返します。 |
CRecordset::Cancel |
非同期操作または 2 番目のスレッドからのプロセスを取り消します。 |
CRecordset::CancelUpdate |
操作Edit が原因で保留中の更新をAddNew 取り消します。 |
CRecordset::CanRestart |
レコードセットのクエリを再度実行するために呼び出すことができる場合 Requery は、0 以外の値を返します。 |
CRecordset::CanScroll |
レコードをスクロールできる場合は、0 以外の値を返します。 |
CRecordset::CanTransact |
データ ソースがトランザクションをサポートしている場合は、0 以外の値を返します。 |
CRecordset::CanUpdate |
レコードセットを更新できる (レコードを追加、更新、または削除できる) 場合は、0 以外の値を返します。 |
CRecordset::CheckRowsetError |
レコードのフェッチ中に生成されたエラーを処理するために呼び出されます。 |
CRecordset::Close |
レコードセットと、それに関連付けられている ODBC HSTMT を閉じます。 |
CRecordset::Delete |
レコードセットから現在のレコードを削除します。 削除後、別のレコードまで明示的にスクロールする必要があります。 |
CRecordset::DoBulkFieldExchange |
データ ソースからレコードセットにデータの一括行を交換するために呼び出されます。 一括レコード フィールド交換 (Bulk RFX) を実装します。 |
CRecordset::DoFieldExchange |
レコードセットのフィールド データ メンバーとデータ ソース上の対応するレコードの間でデータを (双方向に) 交換するために呼び出されます。 レコード フィールド交換 (RFX) を実装します。 |
CRecordset::Edit |
現在のレコードに対する変更を準備します。 呼び出 Update して編集を完了します。 |
CRecordset::FlushResultSet |
定義済みのクエリを使用するときに、取得する別の結果セットがある場合は 0 以外の値を返します。 |
CRecordset::GetBookmark |
レコードのブックマーク値をパラメーター オブジェクトに割り当てます。 |
CRecordset::GetDefaultConnect |
既定の接続文字列を取得するために呼び出されます。 |
CRecordset::GetDefaultSQL |
実行する既定の SQL 文字列を取得するために呼び出されます。 |
CRecordset::GetFieldValue |
レコードセット内のフィールドの値を返します。 |
CRecordset::GetODBCFieldCount |
レコードセット内のフィールドの数を返します。 |
CRecordset::GetODBCFieldInfo |
レコードセット内のフィールドに関する特定の種類の情報を返します。 |
CRecordset::GetRecordCount |
レコードセット内のレコードの数を返します。 |
CRecordset::GetRowsetSize |
1 回のフェッチ中に取得するレコードの数を返します。 |
CRecordset::GetRowsFetched |
フェッチ中に取得された行の実際の数を返します。 |
CRecordset::GetRowStatus |
フェッチ後の行の状態を返します。 |
CRecordset::GetSQL |
レコードセットのレコードを選択するために使用する SQL 文字列を取得します。 |
CRecordset::GetStatus |
レコードセットの状態 (現在のレコードのインデックス、およびレコードの最終カウントが取得されたかどうかを示す) を取得します。 |
CRecordset::GetTableName |
レコードセットの基になるテーブルの名前を取得します。 |
CRecordset::IsBOF |
レコードセットが最初のレコードの前に配置されている場合は、0 以外の値を返します。 現在のレコードはありません。 |
CRecordset::IsDeleted |
レコードセットが削除されたレコードに配置されている場合は、0 以外の値を返します。 |
CRecordset::IsEOF |
レコードセットが最後のレコードの後に配置されている場合は、0 以外の値を返します。 現在のレコードはありません。 |
CRecordset::IsFieldDirty |
現在のレコード内の指定したフィールドが変更された場合は、0 以外の値を返します。 |
CRecordset::IsFieldNull |
現在のレコード内の指定したフィールドが null (値なし) の場合は、0 以外の値を返します。 |
CRecordset::IsFieldNullable |
現在のレコード内の指定したフィールドを null (値を持たない) に設定できる場合は、0 以外の値を返します。 |
CRecordset::IsOpen |
以前に呼び出された場合 Open は 0 以外の値を返します。 |
CRecordset::Move |
レコードセットを、現在のレコードの指定された数のレコードに、どちらの方向にも配置します。 |
CRecordset::MoveFirst |
レコードセットの最初のレコードに現在のレコードを配置します。 最初にテストします IsBOF 。 |
CRecordset::MoveLast |
現在のレコードを最後のレコードまたは最後の行セットに配置します。 最初にテストします IsEOF 。 |
CRecordset::MoveNext |
現在のレコードを次のレコードまたは次の行セットに配置します。 最初にテストします IsEOF 。 |
CRecordset::MovePrev |
現在のレコードを前のレコードまたは前の行セットに配置します。 最初にテストします IsBOF 。 |
CRecordset::OnSetOptions |
指定した ODBC ステートメントのオプション (選択時に使用) を設定するために呼び出されます。 |
CRecordset::OnSetUpdateOptions |
指定した ODBC ステートメントのオプション (更新時に使用) を設定するために呼び出されます。 |
CRecordset::Open |
テーブルを取得するか、レコードセットが表すクエリを実行して、レコードセットを開きます。 |
CRecordset::RefreshRowset |
指定した行のデータと状態を更新します。 |
CRecordset::Requery |
レコードセットのクエリをもう一度実行して、選択したレコードを更新します。 |
CRecordset::SetAbsolutePosition |
指定したレコード番号に対応するレコードにレコードセットを配置します。 |
CRecordset::SetBookmark |
ブックマークで指定されたレコードにレコードセットを配置します。 |
CRecordset::SetFieldDirty |
現在のレコード内の指定したフィールドを変更としてマークします。 |
CRecordset::SetFieldNull |
現在のレコード内の指定したフィールドの値を null (値なし) に設定します。 |
CRecordset::SetLockingMode |
ロック モードを "オプティミスティック" ロック (既定) または "ペシミスティック" ロックに設定します。 更新プログラムのレコードのロック方法を決定します。 |
CRecordset::SetParamNull |
指定したパラメーターを null (値なし) に設定します。 |
CRecordset::SetRowsetCursorPosition |
行セット内の指定した行にカーソルを置きます。 |
CRecordset::SetRowsetSize |
フェッチ中に取得するレコードの数を指定します。 |
CRecordset::Update |
AddNew 新しいデータまたは編集されたデータをデータ ソースに保存して、またはEdit 操作を完了します。 |
パブリック データ メンバー
名前 | 説明 |
---|---|
CRecordset::m_hstmt |
レコードセットの ODBC ステートメント ハンドルを格納します。 「HSTMT 」と入力します。 |
CRecordset::m_nFields |
レコードセット内のフィールド データ メンバーの数を格納します。 「UINT 」と入力します。 |
CRecordset::m_nParams |
レコードセット内のパラメーター データ メンバーの数を格納します。 「UINT 」と入力します。 |
CRecordset::m_pDatabase |
レコードセットがデータ ソースに CDatabase 接続されているオブジェクトへのポインターを格納します。 |
CRecordset::m_strFilter |
CString 構造化照会言語 (SQL) WHERE 句を指定する a が含まれています。 特定の条件を満たすレコードのみを選択するフィルターとして使用されます。 |
CRecordset::m_strSort |
SQL ORDER BY 句を指定する a CString が含まれています。 レコードの並べ替え方法を制御するために使用されます。 |
解説
"レコードセット" CRecordset
と呼ばれるオブジェクトは、通常、ダイナセットとスナップショットの 2 つの形式で使用されます。 ダイナセットは、他のユーザーによって行われたデータ更新と同期された状態を維持します。 スナップショットは、データの静的ビューです。 各フォームは、レコードセットを開いた時点で固定されたレコードのセットを表します。 ダイナセット内のレコードまでスクロールすると、他のユーザーまたはアプリケーション内の他のレコードセットによってレコードに加えられた変更が反映されます。
Note
Open Database Connectivity (ODBC) クラスではなく、データ アクセス オブジェクト (DAO) クラスを使用している場合は、代わりにクラス CDaoRecordset
を使用してください。 詳細については、「概要: データベース プログラミング」を参照してください。
いずれかの種類のレコードセットを操作するには、通常、アプリケーション固有のレコードセット クラス CRecordset
を派生させます。 レコードセットはデータ ソースからレコードを選択し、次の操作を行うことができます。
レコードをスクロールします。
レコードを更新し、ロック モードを指定します。
レコードセットをフィルター処理して、データ ソースで使用可能なレコードから選択するレコードを制限します。
レコードセットを並べ替えます。
実行時まで不明な情報でレコードセットの選択をカスタマイズするには、パラメーター化します。
クラスを使用するには、データベースを開き、レコードセット オブジェクトを構築し、コンストラクターにオブジェクトへのポインターを CDatabase
渡します。 次に、レコードセットのOpen
メンバー関数を呼び出します。ここで、オブジェクトがダイナセットかスナップショットかを指定できます。 呼び出すと Open
、データ ソースからデータが選択されます。 レコードセット オブジェクトを開いた後、そのメンバー関数とデータ メンバーを使用してレコードをスクロールして操作します。 使用できる操作は、オブジェクトがダイナセットかスナップショットか、更新可能か読み取り専用か (これは Open Database Connectivity (ODBC) データ ソースの機能によって異なります)、一括行フェッチを実装しているかどうかによって異なります。 呼び出し以降に変更または追加された可能性のあるレコードを Open
更新するには、オブジェクトの Requery
メンバー関数を呼び出します。 オブジェクト Close
のメンバー関数を呼び出し、終了したらオブジェクトを破棄します。
派生 CRecordset
クラスでは、レコード フィールドの読み取りと更新をサポートするために、レコード フィールド交換 (RFX) または一括レコード フィールド交換 (Bulk RFX) が使用されます。
レコードセットとレコード フィールド交換の詳細については、「概要: データベース プログラミング、レコードセット (ODBC)、Recordset: Fetching Records in Bulk (ODBC)、および Record Field Exchange (RFX)」を参照してください。 ダイナセットとスナップショットに焦点を当てるには、ダイナセットとスナップショットに関する記事を参照してください。
継承階層
CRecordset
要件
ヘッダー:afxdb.h
CRecordset::AddNew
テーブルに新しいレコードを追加する準備をします。
virtual void AddNew();
解説
新しく追加されたレコードを Requery
表示するには、メンバー関数を呼び出す必要があります。 レコードのフィールドは最初は Null です。 (データベースの用語では、Null は "値を持たない" ことを意味し、C++ の NULL と同じではありません)。操作を完了するには、メンバー関数を呼び出す Update
必要があります。 Update
は、変更をデータ ソースに保存します。
Note
一括行フェッチを実装している場合は、呼び出 AddNew
すことはできません。 これにより、アサーションが失敗します。 クラス CRecordset
にはデータの一括行を更新するためのメカニズムは用意されていませんが、ODBC API 関数を使用して独自の関数 SQLSetPos
を記述できます。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
AddNew
は、レコードセットのフィールド データ メンバーを使用して、新しい空のレコードを準備します。 呼び出 AddNew
した後、レコードセットのフィールド データ メンバーに必要な値を設定します。 (〘⾳を呼び出す必要はありません。 この目的でメンバー関数を編集 します。既存のレコードにのみ使用 Edit
します)。呼び出 Update
すと、フィールド データ メンバーの変更された値がデータ ソースに保存されます。
注意事項
呼び出す Update
前に新しいレコードまでスクロールすると、新しいレコードは失われ、警告は表示されません。
データ ソースがトランザクションをサポートしている場合は、呼び出しを AddNew
トランザクションの一部にすることができます。 トランザクションの詳細については、クラス CDatabase
を参照してください。 呼び出す前に呼び出 CDatabase::BeginTrans
します AddNew
。
Note
ダイナセットの場合、レコードセットに最後のレコードとして新しいレコードが追加されます。 追加されたレコードはスナップショットに追加されません。レコードセットを更新するには、呼び出すRequery
必要があります。
メンバー関数が呼び出されていないレコードセットOpen
を呼び出AddNew
すことはできません。 CDBException
A は、追加できないレコードセットを呼び出AddNew
すとスローされます。 レコードセットが更新可能かどうかを確認するには、次を呼び出します CanAppend
。
詳細については、「レコードセット: レコードセットのレコードの更新方法 (ODBC)、レコードセット: レコードの追加、更新、および削除 (ODBC)、およびトランザクション (ODBC)」を参照してください。
例
「トランザクション: レコードセットでのトランザクションの実行 (ODBC)」を参照してください。
CRecordset::CanAppend
以前に開いたレコードセットで新しいレコードを追加できるかどうかを決定します。
BOOL CanAppend() const;
戻り値
レコードセットで新しいレコードを追加できる場合は 0 以外。それ以外の場合は 0。 CanAppend
レコードセットを読み取り専用として開いた場合、0 が返されます。
CRecordset::CanBookmark
レコードセットでブックマークを使用してレコードをマークできるかどうかを決定します。
BOOL CanBookmark() const;
戻り値
レコードセットがブックマークをサポートしている場合は 0 以外。それ以外の場合は 0。
解説
この関数は、メンバー関数の CRecordset::useBookmarks
パラメーターの dwOptions
オプションとは Open
無関係です。 CanBookmark
は、指定された ODBC ドライバーとカーソルの種類がブックマークをサポートするかどうかを示します。 CRecordset::useBookmarks
は、ブックマークがサポートされている場合に、ブックマークを使用できるかどうかを示します。
Note
ブックマークは、前方専用レコードセットではサポートされていません。
ブックマークとレコードセットナビゲーションの詳細については、「 Recordset: Bookmarks and Absolute Positions (ODBC) 」および 「Recordset: Scrolling (ODBC)」を参照してください。
CRecordset::Cancel
データ ソースが進行中の非同期操作または 2 番目のスレッドからのプロセスを取り消すように要求します。
void Cancel();
解説
MFC ODBC クラスでは、非同期処理は使用されなくなりました。非同期操作を実行するには、ODBC API 関数 SQLSetConnectOption
を直接呼び出す必要があります。 詳細については、ODBC SDK プログラマ ガイドの「関数の非同期実行」を参照してください。
CRecordset::CancelUpdate
呼び出される前Update
に、またはAddNew
操作が原因で発生したEdit
保留中の更新を取り消します。
void CancelUpdate();
解説
Note
このメンバー関数は、一括行フェッチを使用しているレコードセットには適用できません。このようなレコードセットは呼び出Edit
AddNew
すことはできません。またはUpdate
、 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
ダーティフィールドの自動チェックが有効になっている場合、CancelUpdate
メンバー変数は以前Edit
またはAddNew
呼び出された値に復元されます。それ以外の場合は、値の変更が再メイン。 既定では、レコードセットを開くと、フィールドの自動チェックが有効になります。 無効にするには、Open メンバー関数の CRecordset::noDirtyFieldCheck
in パラメーターをdwOptions
指定する必要があります。
データの更新の詳細については、「レコードセット: レコードの追加、更新、および削除 (ODBC)」を参照してください。
CRecordset::CanRestart
メンバー関数を呼び出 Requery
して、レコードセットがクエリを再起動 (レコードを更新) できるかどうかを判断します。
BOOL CanRestart() const;
戻り値
再クエリが許可されている場合は 0 以外。それ以外の場合は 0。
CRecordset::CanScroll
レコードセットでスクロールを許可するかどうかを指定します。
BOOL CanScroll() const;
戻り値
レコードセットでスクロールが許可されている場合は 0 以外。それ以外の場合は 0。
解説
スクロールの詳細については、「Recordset: Scrolling (ODBC)」を参照してください。
CRecordset::CanTransact
レコードセットがトランザクションを許可するかどうかを決定します。
BOOL CanTransact() const;
戻り値
レコードセットがトランザクションを許可する場合は 0 以外。それ以外の場合は 0。
解説
詳細については、「トランザクション (ODBC)」を参照してください。
CRecordset::CanUpdate
レコードセットを更新できるかどうかを決定します。
BOOL CanUpdate() const;
戻り値
レコードセットを更新できる場合は 0 以外。それ以外の場合は 0。
解説
基になるデータ ソースが読み取り専用の場合、またはレコードセットを開いたときにパラメーターでdwOptions
指定したCRecordset::readOnly
場合、レコードセットは読み取り専用になることがあります。
CRecordset::CheckRowsetError
レコードのフェッチ中に生成されたエラーを処理するために呼び出されます。
virtual void CheckRowsetError(RETCODE nRetCode);
パラメーター
nRetCode
ODBC API 関数のリターン コード。 詳細については、「解説」を参照してください。
解説
この仮想メンバー関数は、レコードがフェッチされるときに発生するエラーを処理し、一括行フェッチ中に役立ちます。 独自のエラー処理を実装するためにオーバーライドすることを CheckRowsetError
検討してください。
CheckRowsetError
は、カーソル ナビゲーション操作 (たとえば、Open
Requery
任意Move
の操作) で自動的に呼び出されます。 ODBC API 関数 SQLExtendedFetch
の戻り値が渡されます。 次の表に、パラメーターに使用できる値を nRetCode
示します。
nRetCode | 説明 |
---|---|
SQL_SUCCESS |
関数が正常に完了しました。追加情報はありません。 |
SQL_SUCCESS_WITH_INFO |
関数が正常に完了し、致命的でないエラーが発生した可能性があります。 追加の情報は、呼び出 SQLError すことによって取得できます。 |
SQL_NO_DATA_FOUND |
結果セットのすべての行がフェッチされました。 |
SQL_ERROR |
関数が失敗しました。 追加の情報は、呼び出 SQLError すことによって取得できます。 |
SQL_INVALID_HANDLE |
無効な環境ハンドル、接続ハンドル、またはステートメント ハンドルが原因で関数が失敗しました。 これは、プログラミング エラーを示します。 から追加情報を入手できません SQLError 。 |
SQL_STILL_EXECUTING |
非同期的に開始された関数は、まだ実行中です。 既定では、MFC はこの値を ; に CheckRowsetError 渡しません。MFC は、返されなくなるまで呼び出し SQLExtendedFetch を SQL_STILL_EXECUTING 続けます。 |
詳細については SQLError
、Windows SDK を参照してください。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
CRecordset::Close
レコードセットを閉じます。
virtual void Close();
解説
ODBC HSTMT
と、レコードセットに割り当てられたフレームワークのすべてのメモリが割り当て解除されます。 通常、呼び出した Close
後、C++ レコードセット オブジェクトが割り当てられている場合は削除します new
。
呼び出した後にもう一度呼び出Open
Close
すことができます。 これにより、レコードセット オブジェクトを再利用できます。 別の方法は呼び出し Requery
です.
例
// Construct a snapshot object
CCustomer rsCustSet(NULL);
if (!rsCustSet.Open())
return;
// Use the snapshot ...
// Close the snapshot
rsCustSet.Close();
// Destructor is called when the function exits
CRecordset::CRecordset
CRecordset
オブジェクトを構築します。
CRecordset(CDatabase* pDatabase = NULL);
パラメーター
pDatabase
オブジェクトまたは値NULL
へのポインターをCDatabase
格納します。 それ以外 NULL
の場合、 CDatabase
オブジェクトの Open
メンバー関数がデータ ソースに接続するために呼び出されていない場合、レコードセットは独自 Open
の呼び出し中にオブジェクトを開こうとします。 渡 NULL
すと、 CDatabase
ClassWizard を使用してレコードセット クラスを派生したときに指定したデータ ソース情報を使用して、オブジェクトが構築され、接続されます。
解説
直接使用 CRecordset
するか、アプリケーション固有のクラス CRecordset
を派生させることができます。 ClassWizard を使用して、レコードセット クラスを派生させることができます。
Note
派生クラス は、独自のコンストラクターを指定する必要があります 。 派生クラスのコンストラクターで、適切なパラメーターを渡してコンストラクターを呼び出します CRecordset::CRecordset
。
オブジェクトを自動的に構築して接続するにはCDatabase
、レコードセット コンストラクターに渡NULL
します。 これは便利な短縮形であり、レコードセットを構築する前にオブジェクトを CDatabase
構築して接続する必要はありません。
例
詳細については、「 Recordset: テーブルのクラスの宣言 (ODBC)」を参照してください。
CRecordset::Delete
現在のレコードを削除します。
virtual void Delete();
解説
削除が成功すると、レコードセットのフィールド データ メンバーは Null 値に設定され、削除されたレコードから移動するには、関数の Move
1 つを明示的に呼び出す必要があります。 削除されたレコードから移動すると、そのレコードに戻ることはできません。 データ ソースがトランザクションをサポートしている場合は、呼び出しを Delete
トランザクションの一部にすることができます。 詳細については、「トランザクション (ODBC)」を参照してください。
Note
一括行フェッチを実装している場合は、呼び出 Delete
すことはできません。 これにより、アサーションが失敗します。 クラス CRecordset
にはデータの一括行を更新するためのメカニズムは用意されていませんが、ODBC API 関数を使用して独自の関数 SQLSetPos
を記述できます。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
注意事項
レコードセットは更新可能で、呼び出 Delete
すときにレコードセット内に有効なレコードが存在する必要があります。それ以外の場合はエラーが発生します。 たとえば、レコードを削除しても、再度呼び出す Delete
前に新しいレコードまでスクロールしない場合、 Delete
CDBException がスロー されます。
とは異なりAddNew
、Edit
呼び出しの後Update
に Delete
. 呼び出しが Delete
失敗した場合、フィールド データ メンバーは変更されません。
例
この例では、関数のフレームに作成されたレコードセットを示します。 この例では、データ ソースに既に接続されている型CDatabase
のメンバー変数 、の存在m_dbCust
を前提としています。
// Create a derived CRecordset object
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();
if (rsCustSet.IsEOF() || !rsCustSet.CanUpdate() ||
!rsCustSet.CanTransact())
{
return;
}
m_dbCust.BeginTrans();
// Perhaps scroll to a new record...
// Delete the current record
rsCustSet.Delete();
// Finished commands for this transaction
if (IDYES == AfxMessageBox(_T("Commit transaction?"), MB_YESNO))
m_dbCust.CommitTrans();
else // User changed mind
m_dbCust.Rollback();
CRecordset::DoBulkFieldExchange
データ ソースからレコードセットにデータの一括行を交換するために呼び出されます。 一括レコード フィールド交換 (Bulk RFX) を実装します。
virtual void DoBulkFieldExchange(CFieldExchange* pFX);
パラメーター
pFX
CFieldExchange
オブジェクトを指すポインターです。 フレームワークでは、フィールド交換操作のコンテキストを指定するために、このオブジェクトが既に設定されています。
解説
一括行フェッチが実装されると、フレームワークはこのメンバー関数を呼び出して、データ ソースからレコードセット オブジェクトにデータを自動的に転送します。 DoBulkFieldExchange
また、パラメーター データ メンバー (存在する場合) を、レコードセットの選択の SQL ステートメント文字列内のパラメーター プレースホルダーにバインドします。
一括行フェッチが実装されていない場合は、フレームワークが呼び出します DoFieldExchange
。 一括行フェッチを実装するには、メンバー関数で CRecordset::useMultiRowFetch
dwOptions パラメーターのオプションを指定するOpen
必要があります。
Note
DoBulkFieldExchange
は、派生 CRecordset
クラスを使用している場合にのみ使用できます。 レコードセット オブジェクトを直接 CRecordset
作成した場合は、メンバー関数を呼び出してデータを GetFieldValue
取得する必要があります。
一括レコード フィールド交換 (Bulk RFX) は、レコード フィールド交換 (RFX) に似ています。 データは、データ ソースからレコードセット オブジェクトに自動的に転送されます。 ただし、呼び出したりAddNew
Edit
、Delete
変更をデータ ソースに転送したりUpdate
することはできません。 現在、クラス CRecordset
はデータの一括行を更新するためのメカニズムを提供していませんが、ODBC API 関数を使用して独自の関数 SQLSetPos
を記述できます。
ClassWizard では、一括レコード フィールド交換はサポートされていません。そのため、Bulk RFX 関数の呼び出しを書き込んで手動でオーバーライド DoBulkFieldExchange
する必要があります。 これらの関数の詳細については、「レコード フィールドの Exchange 関数」を参照してください。
バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。 関連情報については、レコード・フィールド交換 (RFX) を参照してください。
CRecordset::DoFieldExchange
レコードセットのフィールド データ メンバーとデータ ソース上の対応するレコードの間でデータを (双方向に) 交換するために呼び出されます。 レコード フィールド交換 (RFX) を実装します。
virtual void DoFieldExchange(CFieldExchange* pFX);
パラメーター
pFX
CFieldExchange
オブジェクトを指すポインターです。 フレームワークでは、フィールド交換操作のコンテキストを指定するために、このオブジェクトが既に設定されています。
解説
一括行フェッチが実装されていない場合、フレームワークはこのメンバー関数を呼び出して、レコードセット オブジェクトのフィールド データ メンバーとデータ ソース上の現在のレコードの対応する列の間でデータを自動的に交換します。 DoFieldExchange
また、パラメーター データ メンバー (存在する場合) を、レコードセットの選択の SQL ステートメント文字列内のパラメーター プレースホルダーにバインドします。
一括行フェッチが実装されている場合、フレームワークによって呼び出されます DoBulkFieldExchange
。 一括行フェッチを実装するには、メンバー関数でパラメーターのオプションをdwOptions
指定CRecordset::useMultiRowFetch
するOpen
必要があります。
Note
DoFieldExchange
は、派生 CRecordset
クラスを使用している場合にのみ使用できます。 レコードセット オブジェクトを直接CRecordset
作成した場合は、GetFieldValue メンバー関数を呼び出してデータを取得する必要があります。
レコード フィールド交換 (RFX) と呼ばれるフィールド データの交換は、レコードセット オブジェクトのフィールド データ メンバーからデータ ソースのレコードのフィールド、およびデータ ソースのレコードからレコード セット オブジェクトへの双方向で機能します。
派生レコードセット クラスに実装するために DoFieldExchange
通常実行する必要がある唯一のアクションは、ClassWizard を使用してクラスを作成し、フィールド データ メンバーの名前とデータ型を指定することです。 ClassWizard が書き込むコードを追加して、パラメーター データ メンバーを指定したり、動的にバインドする列を処理したりすることもできます。 詳細については、「レコードセット: データ列を動的に結びつける方法 (ODBC)」を参照してください。
ClassWizard を使用して派生レコードセット クラスを宣言すると、ウィザードによってオーバーライド DoFieldExchange
が書き込まれます。これは次の例のようになります。
void CCustomer::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);
// Macros such as RFX_Text() and RFX_Int() are dependent on the
// type of the member variable, not the type of the field in the database.
// ODBC will try to automatically convert the column value to the requested type
RFX_Long(pFX, _T("[CustomerID]"), m_CustomerID);
RFX_Text(pFX, _T("[ContactFirstName]"), m_ContactFirstName);
RFX_Text(pFX, _T("[PostalCode]"), m_PostalCode);
RFX_Text(pFX, _T("[L_Name]"), m_L_Name);
RFX_Long(pFX, _T("[BillingID]"), m_BillingID);
pFX->SetFieldType(CFieldExchange::inputParam);
RFX_Text(pFX, _T("Param"), m_strParam);
}
RFX 関数の詳細については、「レコード フィールド交換関数」を参照してください。
詳細な例と詳細DoFieldExchange
については、「レコード フィールド交換: RFX のしくみ」を参照してください。 RFX の一般的な情報については、「レコード フィールド交換」を参照してください。
CRecordset::Edit
現在のレコードに対する変更を許可します。
virtual void Edit();
解説
呼び出した Edit
後、フィールド データ メンバーの値を直接リセットすることで変更できます。 メンバー関数を呼び出して変更を Update
データ ソースに保存すると、操作が完了します。
Note
一括行フェッチを実装している場合は、呼び出 Edit
すことはできません。 これにより、アサーションが失敗します。 クラス CRecordset
にはデータの一括行を更新するためのメカニズムは用意されていませんが、ODBC API 関数を使用して独自の関数 SQLSetPos
を記述できます。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
Edit
は、レコードセットのデータ メンバーの値を保存します。 呼び出 Edit
して変更を加えた後、再度呼び出 Edit
すと、レコードの値は最初 Edit
の呼び出しの前の値に復元されます。
場合によっては、列を Null (データを含まない) にして更新することが必要になる場合があります。 これを行うには、TRUE のパラメーターを指定してフィールド Null をマークする呼び出し SetFieldNull
を行います。これにより、列も更新されます。 値が変更されていない場合でもフィールドをデータ ソースに書き込む場合は、TRUE のパラメーターを指定して呼び出 SetFieldDirty
します。 これは、フィールドの値が Null の場合でも機能します。
データ ソースがトランザクションをサポートしている場合は、呼び出しを Edit
トランザクションの一部にすることができます。 呼び出し前とレコードセットを開いた後の呼び出CDatabase::BeginTrans
Edit
し。 また、呼び出し CDatabase::CommitTrans
は、操作を完了するための呼び出し Update
の Edit
代わりではありません。 トランザクションの詳細については、クラス CDatabase
を参照してください。
現在のロック モードによっては、更新されるレコードは、別のレコードを呼び出すかスクロールするまでロック Edit
されるか、または呼び出 Update
し中 Edit
にのみロックされる場合があります。 でロックモード SetLockingMode
を変更できます。
呼び出す Update
前に新しいレコードまでスクロールすると、現在のレコードの以前の値が復元されます。 A CDBException
は、更新できないレコードセットを呼び出 Edit
す場合、または現在のレコードがない場合にスローされます。
詳細については、「トランザクション (ODBC)」および「レコードセット: レコードのロック (ODBC)」を参照してください。
例
// To edit a record, first set up the edit buffer
rsCustSet.Edit();
// Then edit field data members for the record
rsCustSet.m_BillingID = 2795;
rsCustSet.m_ContactFirstName = _T("Jones Mfg");
// Finally, complete the operation
if (!rsCustSet.Update())
{
// Handle the failure to update
AfxMessageBox(_T("Couldn't update record!"));
}
CRecordset::FlushResultSet
複数の結果セットがある場合は、定義済みのクエリ (ストアド プロシージャ) の次の結果セットを取得します。
BOOL FlushResultSet();
戻り値
取得する結果セットがそれ以上ある場合は 0 以外。それ以外の場合は 0。
解説
現在の結果セットのカーソルが終了したときにのみ呼び出 FlushResultSet
す必要があります。 呼び出 FlushResultSet
して次の結果セットを取得すると、その結果セットでカーソルが無効になります。呼び出し後にメンバー関数を MoveNext
呼び出す FlushResultSet
必要があります。
定義済みのクエリで出力パラメーターまたは入力/出力パラメーターを使用する場合、これらのパラメーター値を取得するには、(値 0) が返FALSE
されるまで呼び出すFlushResultSet
必要があります。
FlushResultSet
は ODBC API 関数 SQLMoreResults
を呼び出します。 or SQLMoreResults
SQL_INVALID_HANDLE
をFlushResultSet
返すとSQL_ERROR
、例外がスローされます。 詳細については SQLMoreResults
、Windows SDK を参照してください。
呼び出 FlushResultSet
す場合は、ストアド プロシージャにバインドされたフィールドが必要です。
例
次のコードは、 COutParamRecordset
入力パラメーターと出力パラメーターを CRecordset
持ち、複数の結果セットを持つ定義済みのクエリに基づく -derived オブジェクトであることを前提としています。 オーバーライドの構造に DoFieldExchange
注意してください。
// DoFieldExchange override
//
// Only necessary to handle parameter bindings.
// Don't use CRecordset-derived class with bound
// fields unless all result sets have same schema
// OR there is conditional binding code.
void CCourses::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputParam);
RFX_Long(pFX, _T("Param1"), m_nCountParam);
// The "Param1" name here is a dummy name
// that is never used
pFX->SetFieldType(CFieldExchange::inputParam);
RFX_Text(pFX, _T("Param2"), m_strNameParam);
// The "Param2" name here is a dummy name
// that is never used
}
// Assume db is an already open CDatabase object
CCourses rs(&m_dbCust);
rs.m_strNameParam = _T("History");
// Get the first result set
// NOTE: SQL Server requires forwardOnly cursor
// type for multiple rowset returning stored
// procedures
rs.Open(CRecordset::forwardOnly,
_T("{? = CALL GetCourses( ? )}"),
CRecordset::readOnly);
// Loop through all the data in the first result set
while (!rs.IsEOF())
{
CString strFieldValue;
for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
{
rs.GetFieldValue(nIndex, strFieldValue);
// TO DO: Use field value string.
}
rs.MoveNext();
}
// Retrieve other result sets...
while (rs.FlushResultSet())
{
// must call MoveNext because cursor is invalid
rs.MoveNext();
while (!rs.IsEOF())
{
CString strFieldValue;
for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
{
rs.GetFieldValue(nIndex, strFieldValue);
// TO DO: Use field value string.
}
rs.MoveNext();
}
}
// All result sets have been flushed. Cannot
// use the cursor, but the output parameter,
// m_nCountParam, has now been written.
// Note that m_nCountParam is not valid until
// CRecordset::FlushResultSet has returned FALSE,
// indicating no more result sets will be returned.
// TO DO: Use m_nCountParam
// Cleanup
rs.Close();
CRecordset::GetBookmark
現在のレコードのブックマーク値を取得します。
void GetBookmark(CDBVariant& varBookmark);
パラメーター
varBookmark
現在のレコードの CDBVariant
ブックマークを表すオブジェクトへの参照。
解説
ブックマークがレコードセットでサポートされているかどうかを確認するには、次を呼び出します CanBookmark
。 サポートされている場合にブックマークを使用できるようにするには、メンバー関数のパラメーターでオプションをdwOptions
設定CRecordset::useBookmarks
するOpen
必要があります。
Note
ブックマークがサポートされていないか使用できない場合、呼び出し GetBookmark
によって例外がスローされます。 ブックマークは、前方専用レコードセットではサポートされていません。
GetBookmark
は、現在のレコードのブックマークの値をオブジェクトに CDBVariant
割り当てます。 別のレコードに移動した後、いつでもそのレコードに戻すには、対応するCDBVariant
オブジェクトを呼び出SetBookmark
します。
Note
特定のレコードセット操作の後、ブックマークが無効になる可能性があります。 たとえば、次Requery
のように呼び出GetBookmark
した場合、レコードにSetBookmark
戻ることができない場合があります。 安全に呼び出CDatabase::GetBookmarkPersistence
すことができるかどうかをチェックする呼び出しSetBookmark
。
ブックマークとレコードセットナビゲーションの詳細については、「 Recordset: Bookmarks and Absolute Positions (ODBC) 」および 「Recordset: Scrolling (ODBC)」を参照してください。
CRecordset::GetDefaultConnect
既定の接続文字列を取得するために呼び出されます。
virtual CString GetDefaultConnect();
戻り値
既定の接続文字列を含む ACString
。
解説
フレームワークは、このメンバー関数を呼び出して、レコードセットの基になっているデータ ソースの既定の接続文字列を取得します。 ClassWizard
は、テーブルと列に関する情報を取得するために使用 ClassWizard
するのと同じデータ ソースを識別することで、この関数を実装します。 アプリケーションの開発時に、この既定の接続に依存すると便利な場合があります。 ただし、既定の接続は、アプリケーションのユーザーには適していない場合があります。 その場合は、この関数を再実装カード 's version' を区別するClassWizard
必要があります。 接続文字列の詳細については、「データ ソース (ODBC)」を参照してください。
CRecordset::GetDefaultSQL
実行する既定の SQL 文字列を取得するために呼び出されます。
virtual CString GetDefaultSQL();
戻り値
既定の SQL ステートメントを含む A CString
。
解説
フレームワークは、このメンバー関数を呼び出して、レコードセットの基になっている既定の SQL ステートメントを取得します。 テーブル名または SQL SELECT
ステートメントを指定できます。
レコードセット クラス ClassWizard
を宣言して既定の SQL ステートメントを間接的に定義し、 ClassWizard
このタスクを実行します。
自分で使用するために SQL ステートメント文字列が必要な場合は、レコードセットを開いたときにレコードセットのレコードを選択するために使用される SQL ステートメントを返す呼び出し GetSQL
。 クラスのオーバーライド GetDefaultSQL
で、既定の SQL 文字列を編集できます。 たとえば、ステートメントを使用して定義済みのクエリの呼び出しを CALL
指定できます。 (ただし、編集 GetDefaultSQL
する場合は、データ ソース内の列数と一致するように変更 m_nFields
する必要があることに注意してください)。
詳細については、「 Recordset: テーブルのクラスの宣言 (ODBC)」を参照してください。
注意事項
フレームワークがテーブル名を識別できなかった場合、複数のテーブル名が指定された場合、またはステートメントを CALL
解釈できなかった場合、テーブル名は空になります。 ステートメントを使用CALL
する場合は、中かっことCALL
キーワード (keyword)の間、または中かっこの前、またはステートメント内のキーワード (keyword)SELECT
のSELECT
前に空白を挿入しないでください。
CRecordset::GetFieldValue
現在のレコードのフィールド データを取得します。
void GetFieldValue(
LPCTSTR lpszName,
CDBVariant& varValue,
short nFieldType = DEFAULT_FIELD_TYPE);
void GetFieldValue(
LPCTSTR lpszName,
CStringA& strValue
);
void GetFieldValue(
LPCTSTR lpszName,
CStringW& strValue
);
void GetFieldValue(
short nIndex,
CDBVariant& varValue,
short nFieldType = DEFAULT_FIELD_TYPE);
void GetFieldValue(
short nIndex,
CStringA& strValue);
void GetFieldValue(
short nIndex,
CStringW& strValue);
パラメーター
lpszName
フィールドの名前。
varValue
フィールドの値を CDBVariant
格納するオブジェクトへの参照。
nFieldType
フィールドの ODBC C データ型。 既定値を使用すると、 DEFAULT_FIELD_TYPE
次の表に基づいて、SQL データ型から C データ型が強制的 GetFieldValue
に決定されます。 それ以外の場合は、データ型を直接指定するか、互換性のあるデータ型を選択できます。たとえば、任意のデータ型 SQL_C_CHAR
を .
C data type (C データ型) | SQL data type (SQL データ型) |
---|---|
SQL_C_BIT |
SQL_BIT |
SQL_C_UTINYINT |
SQL_TINYINT |
SQL_C_SSHORT |
SQL_SMALLINT |
SQL_C_SLONG |
SQL_INTEGER |
SQL_C_FLOAT |
SQL_REAL |
SQL_C_DOUBLE |
SQL_FLOATSQL_DOUBLE |
SQL_C_TIMESTAMP |
SQL_DATESQL_TIMESQL_TIMESTAMP |
SQL_C_CHAR |
SQL_NUMERICSQL_DECIMALSQL_BIGINTSQL_CHARSQL_VARCHARSQL_LONGVARCHAR |
SQL_C_BINARY |
SQL_BINARYSQL_VARBINARYSQL_LONGVARBINARY |
ODBC データ型の詳細については、Windows SDK の付録 D の「SQL データ型」および「C データ型」のトピックを参照してください。
nIndex
フィールドの 0 から始まるインデックス。
strValue
フィールドの CString
データ型に関係なく、テキストに変換されたフィールドの値を格納するオブジェクトへの参照。
解説
フィールドは、名前またはインデックスで検索できます。 フィールド値は、オブジェクトまたはCString
オブジェクトにCDBVariant
格納できます。
一括行フェッチを実装した場合、現在のレコードは常に行セットの最初のレコードに配置されます。 特定の行セット内のレコードで使用 GetFieldValue
するには、まずメンバー関数を SetRowsetCursorPosition
呼び出して、その行セット内の目的の行にカーソルを移動する必要があります。 その後、その行を呼び出 GetFieldValue
します。 一括行フェッチを実装するには、メンバー関数でパラメーターのオプションをdwOptions
指定CRecordset::useMultiRowFetch
するOpen
必要があります。
デザイン時に静的にバインドするのではなく、実行時にフィールドを動的にフェッチするために使用 GetFieldValue
できます。 たとえば、レコードセット オブジェクトを直接 CRecordset
宣言した場合、フィールド データの取得に使用 GetFieldValue
する必要があります。レコード フィールド交換 (RFX)、または一括レコード フィールド交換 (Bulk RFX) は実装されていません。
Note
派生せずにレコードセット オブジェクトを宣言する CRecordset
場合は、ODBC カーソル ライブラリを読み込んでいません。 カーソル ライブラリでは、レコードセットに少なくとも 1 つのバインドされた列が必要です。ただし、直接使用 CRecordset
する場合、どの列もバインドされていません。 メンバー関数 CDatabase::OpenEx
と CDatabase::Open
カーソル ライブラリを読み込むかどうかを制御します。
GetFieldValue
は ODBC API 関数 SQLGetData
を呼び出します。 ドライバーがフィールド値の実際の長さのSQL_NO_TOTAL値を出力する場合は、 GetFieldValue
例外をスローします。 詳細については SQLGetData
、Windows SDK を参照してください。
例
次のサンプル コードは、から直接CRecordset
宣言されたレコードセット オブジェクトのGetFieldValue
呼び出しを示しています。
// Create and open a database object;
// do not load the cursor library
CDatabase db;
db.OpenEx(NULL, CDatabase::forceOdbcDialog);
// Create and open a recordset object
// directly from CRecordset. Note that a
// table must exist in a connected database.
// Use forwardOnly type recordset for best
// performance, since only MoveNext is required
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly, _T("SELECT * FROM Customer"));
// Create a CDBVariant object to
// store field data
CDBVariant varValue;
// Loop through the recordset,
// using GetFieldValue and
// GetODBCFieldCount to retrieve
// data in all columns
short nFields = rs.GetODBCFieldCount();
while (!rs.IsEOF())
{
for (short index = 0; index < nFields; index++)
{
rs.GetFieldValue(index, varValue);
// do something with varValue
}
rs.MoveNext();
}
rs.Close();
db.Close();
Note
DAO クラス CDaoRecordset
とは異なり、 CRecordset
メンバー関数はありません SetFieldValue
。 オブジェクトを直接 CRecordset
作成すると、実質的に読み取り専用になります。
バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
CRecordset::GetODBCFieldCount
レコードセット オブジェクト内のフィールドの合計数を取得します。
short GetODBCFieldCount() const;
戻り値
レコードセット内のフィールドの数。
解説
レコードセットの作成の詳細については、「 レコードセット: レコードセットの作成と終了 (ODBC)」を参照してください。
CRecordset::GetODBCFieldInfo
レコードセット内のフィールドに関する情報を取得します。
void GetODBCFieldInfo(
LPCTSTR lpszName,
CODBCFieldInfo& fieldinfo);
void GetODBCFieldInfo(
short nIndex,
CODBCFieldInfo& fieldinfo);
パラメーター
lpszName
フィールドの名前。
fieldinfo
構造体への CODBCFieldInfo
参照。
nIndex
フィールドの 0 から始まるインデックス。
解説
関数の 1 つのバージョンでは、名前でフィールドを検索できます。 もう 1 つのバージョンでは、インデックスでフィールドを検索できます。
返される情報の説明については、構造体を CODBCFieldInfo
参照してください。
レコードセットの作成の詳細については、「 レコードセット: レコードセットの作成と終了 (ODBC)」を参照してください。
CRecordset::GetRecordCount
レコードセットのサイズを決定します。
long GetRecordCount() const;
戻り値
レコードセット内のレコードの数。レコードセットにレコードが含まれている場合は 0。レコード数を特定できない場合は -1。
解説
注意事項
レコード数はメイン"高いウォーター マーク" として含まれます。これは、ユーザーがレコード内を移動すると見なされる最も番号の高いレコードです。 レコードの合計数は、ユーザーが最後のレコードを超えて移動した後でのみ認識されます。 パフォーマンス上の理由から、呼び出 MoveLast
し時にカウントが更新されません。 レコードを自分でカウントするには、0 以外の値が返されるまでIsEOF
繰り返し呼び出MoveNext
します。 レコードを追加すると CRecordset:AddNew
カウント Update
が増え、レコード CRecordset::Delete
を削除するとカウントが減少します。
CRecordset::GetRowsetSize
特定のフェッチ中に取得する行数の現在の設定を取得します。
DWORD GetRowsetSize() const;
戻り値
特定のフェッチ中に取得する行の数。
解説
一括行フェッチを使用している場合、レコードセットを開くときの既定の行セット サイズは 25 です。それ以外の場合は 1 です。
一括行フェッチを実装するには、メンバー関数の CRecordset::useMultiRowFetch
パラメーターにオプションを dwOptions
指定する Open
必要があります。 行セット サイズの設定を変更するには、次を呼び出します SetRowsetSize
。
バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
CRecordset::GetRowsFetched
フェッチ後に取得されたレコードの数を決定します。
DWORD GetRowsFetched() const;
戻り値
特定のフェッチ後にデータ ソースから取得された行の数。
解説
これは、一括行フェッチを実装した場合に便利です。 通常、行セット のサイズは、フェッチから取得される行の数を示します。 ただし、レコードセット内の行の合計数は、1 つの行セットで取得される行の数にも影響します。 たとえば、レコードセットのサイズ設定が 4 のレコードが 10 個ある場合、呼び出 MoveNext
しによってレコードセットをループ処理すると、最終的な行セットには 2 つのレコードのみが含まれます。
一括行フェッチを実装するには、メンバー関数の CRecordset::useMultiRowFetch
dwOptions パラメーターでオプションを指定するOpen
必要があります。 行セットのサイズを指定するには、SetRowsetSize を呼び出します。
バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
例
CMultiCustomer rs(&m_dbCust);
// Set the rowset size
rs.SetRowsetSize(5);
// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);
// loop through the recordset by rowsets
while (!rs.IsEOF())
{
for (int rowCount = 0; rowCount < (int)rs.GetRowsFetched(); rowCount++)
{
// do something
}
rs.MoveNext();
}
rs.Close();
CRecordset::GetRowStatus
現在の行セット内の行の状態を取得します。
WORD GetRowStatus(WORD wRow) const;
パラメーター
wRow
現在の行セット内の行の 1 から始まる位置。 この値の範囲は、1 から行セットのサイズまでです。
戻り値
行の状態値。 詳細については、「解説」を参照してください。
解説
GetRowStatus
は、データ ソースから最後に取得されてから行の状態が変更されたか、または対応する行がフェッチされなかったことを示す値を wRow
返します。 次の表は、可能性のある戻り値の一覧です。
状態 の値 | 説明 |
---|---|
SQL_ROW_SUCCESS |
行は変更されません。 |
SQL_ROW_UPDATED |
行が更新されました。 |
SQL_ROW_DELETED |
行が削除されました。 |
SQL_ROW_ADDED |
行が追加されました。 |
SQL_ROW_ERROR |
エラーが原因で行を取得できません。 |
SQL_ROW_NOROW |
に対応する wRow 行はありません。 |
詳細については、Windows SDK の ODBC API 関数 SQLExtendedFetch
を参照してください。
CRecordset::GetStatus
レコードセット内の現在のレコードのインデックスと、最後のレコードが表示されたかどうかを判断します。
void GetStatus(CRecordsetStatus& rStatus) const;
パラメーター
rStatus
CRecordsetStatus
オブジェクトへの参照です。 詳細については、「解説」をご覧ください。
解説
CRecordset
はインデックスの追跡を試みますが、状況によってはこれが不可能な場合があります。 詳細については、以下を参照してください GetRecordCount
。
構造体の形式は CRecordsetStatus
次のとおりです。
struct CRecordsetStatus
{
long m_lCurrentRecord;
BOOL m_bRecordCountFinal;
};
2 つのメンバー CRecordsetStatus
には、次の意味があります。
m_lCurrentRecord
レコードセット内の現在のレコードの 0 から始まるインデックス (既知の場合) を格納します。 インデックスを特定できない場合、このメンバーには (-2) が含まれますAFX_CURRENT_RECORD_UNDEFINED
。 TRUE (空のレコードセットまたは最初のレコードの前にスクロールを試みる) のm_lCurrentRecord
場合IsBOF
は、(-1) にAFX_CURRENT_RECORD_BOF
設定されます。 最初のレコードの場合は、0、2 番目のレコード 1 に設定されます。m_bRecordCountFinal
レコードセット内のレコードの合計数が決定された場合は 0 以外。 通常、これはレコードセットの先頭から開始し、0 以外の値が返されるまでIsEOF
呼び出MoveNext
すことによって実現する必要があります。 このメンバーが 0 の場合、-1 でない場合に返されるGetRecordCount
レコード数は、レコードの "高いウォーター マーク" カウントに過ぎません。
CRecordset::GetSQL
このメンバー関数を呼び出して、レコードセットを開いたときにレコードセットのレコードを選択するために使用された SQL ステートメントを取得します。
const CString& GetSQL() const;
戻り値
const
SQL ステートメントを含む a CString
への参照。
解説
これは通常、SQL SELECT
ステートメントです。 返される GetSQL
文字列は読み取り専用です。
通常、返されるGetSQL
文字列は、パラメーターOpen
内のレコードセットlpszSQL
にメンバー関数に渡した文字列とは異なります。 これは、渡した内容、指定した内容、指定したデータ メンバーとm_strSort
データ メンバー、m_strFilter
および指定ClassWizard
したOpen
パラメーターに基づいて、レコードセットによって完全な SQL ステートメントが構築されるためです。 レコードセットがこの SQL ステートメントを構築する方法の詳細については、「Recordset: レコードセットがレコードを選択する方法 (ODBC)」を参照してください。
Note
呼び出した後でのみ、このメンバー関数を呼び出します Open
。
CRecordset::GetTableName
レコードセットのクエリの基になる SQL テーブルの名前を取得します。
const CString& GetTableName() const;
戻り値
const
レコードセットがテーブルに基づいている場合は、テーブル名を含む a CString
への参照。それ以外の場合は空の文字列。
解説
GetTableName
は、レコードセットがテーブルに基づいている場合にのみ有効であり、複数のテーブルまたは定義済みのクエリ (ストアド プロシージャ) の結合ではありません。 名前は読み取り専用です。
Note
呼び出した後でのみ、このメンバー関数を呼び出します Open
。
CRecordset::IsBOF
レコードセットが最初のレコードの前に配置されている場合は、0 以外の値を返します。 現在のレコードはありません。
BOOL IsBOF() const;
戻り値
レコードセットにレコードが含まれている場合、または最初のレコードの前に後方にスクロールした場合は 0 以外。それ以外の場合は 0。
解説
レコードからレコードまでスクロールする前に、このメンバー関数を呼び出して、レコードセットの最初のレコードの前に移動したかどうかを確認します。 また、レコードセットにレコードが含まれているか空であるかを判断するためにも使用IsBOF
IsEOF
できます。 呼び出 Open
した直後に、レコードセットにレコードが含まれている場合は、 IsBOF
0 以外の値が返されます。 少なくとも 1 つのレコードを含むレコードセットを開くと、最初のレコードが現在のレコードになり、 IsBOF
0 が返されます。
最初のレコードが現在のレコードであり、呼び出 MovePrev
す場合は、 IsBOF
0 以外の値が返されます。 IsBOF
0 以外の値を返し、呼び出MovePrev
すとエラーが発生します。 0 以外の値を返した場合 IsBOF
、現在のレコードは未定義になり、現在のレコードを必要とするアクションはエラーになります。
例
この例では、IsEOF
コードが両方向にレコードセットをスクロールする場合に、レコードセットの制限を使用IsBOF
して検出します。
// Open a recordset; first record is current
// Open a recordset; first record is current
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();
if(rsCustSet.IsBOF())
return;
// The recordset is empty
// Scroll to the end of the recordset, past
// the last record, so no record is current
while (!rsCustSet.IsEOF())
rsCustSet.MoveNext();
// Move to the last record
rsCustSet.MoveLast();
// Scroll to beginning of the recordset, before
// the first record, so no record is current
while(!rsCustSet.IsBOF())
rsCustSet.MovePrev();
// First record is current again
rsCustSet.MoveFirst();
CRecordset::IsDeleted
現在のレコードが削除されたかどうかを判断します。
BOOL IsDeleted() const;
戻り値
レコードセットが削除されたレコードに配置されている場合は 0 以外。それ以外の場合は 0。
解説
レコードにスクロールして IsDeleted
(0 以外の) 値を返す場合は、他の TRUE
レコードセット操作を実行する前に、別のレコードまでスクロールする必要があります。
結果は、レコードセットの IsDeleted
種類、レコードセットが更新可能かどうか、レコードセットを開いたときにオプションを指定した CRecordset::skipDeletedRecords
かどうか、ドライバーがレコードを削除したかどうか、複数のユーザーがあるかどうかなど、さまざまな要因によって異なります。
ドライバーのパッキングの詳細CRecordset::skipDeletedRecords
については、Open メンバー関数を参照してください。
Note
一括行フェッチを実装している場合は、呼び出 IsDeleted
さないでください。 代わりに、GetRowStatus メンバー関数を呼び出します。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
CRecordset::IsEOF
レコードセットが最後のレコードの後に配置されている場合は、0 以外の値を返します。 現在のレコードはありません。
BOOL IsEOF() const;
戻り値
レコードセットにレコードが含まれている場合、または最後のレコードを超えてスクロールした場合は 0 以外。それ以外の場合は 0。
解説
レコードからレコードまでスクロールして、レコードセットの最後のレコードを超えたかどうかを確認するには、このメンバー関数を呼び出します。 レコードセットにレコードが含まれているか、空であるかを判断するためにも使用 IsEOF
できます。 呼び出 Open
した直後に、レコードセットにレコードが含まれている場合は、 IsEOF
0 以外の値が返されます。 少なくとも 1 つのレコードを含むレコードセットを開くと、最初のレコードが現在のレコードになり、 IsEOF
0 が返されます。
最後のレコードが呼び出 MoveNext
し時に現在のレコードである場合は、 IsEOF
0 以外の値が返されます。 IsEOF
0 以外の値を返し、呼び出MoveNext
すとエラーが発生します。 0 以外の値を返した場合 IsEOF
、現在のレコードは未定義になり、現在のレコードを必要とするアクションはエラーになります。
例
IsBOF
の例を参照してください。
CRecordset::IsFieldDirty
指定したフィールド データ メンバーが、その後またはAddNew
呼び出された後Edit
に変更されたかどうかを判断します。
BOOL IsFieldDirty(void* pv);
パラメーター
pv
状態をチェックするフィールド データ メンバーへのポインター、またはNULL
フィールドのいずれかがダーティされているかどうかを判断するポインター。
戻り値
指定したフィールド データ メンバーが呼び出し AddNew
後に変更された場合は 0 以外、 Edit
それ以外の場合は 0。
解説
現在のレコードがメンバー関数の呼び出し (または呼び出Update
しの後) によって更新されると、すべてのダーティフィールド データ メンバーのデータがデータ ソースのCRecordset
レコードにEdit
AddNew
転送されます。
Note
このメンバー関数は、一括行フェッチを使用しているレコードセットには適用されません。 一括行フェッチを実装した場合、IsFieldDirty
常に FAL Standard Edition が返され、アサーションが失敗します。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
フィールドのダーティ状態が再評価されるため、SetFieldDirty IsFieldDirty
の前の呼び出しの効果がリセットされます。 AddNew
この場合、現在のフィールド値が擬似 null 値と異なる場合、フィールドの状態はダーティ設定されます。 Edit
この場合、フィールド値がキャッシュされた値と異なる場合、フィールドの状態はダーティ設定されます。
IsFieldDirty
を使用して DoFieldExchange
実装されます。
ダーティ フラグの詳細については、「Recordset: How Recordsets Select Records (ODBC)」を参照してください。
CRecordset::IsFieldNull
現在のレコードの指定したフィールドが Null (値なし) の場合は、0 以外の値を返します。
BOOL IsFieldNull(void* pv);
パラメーター
pv
状態をチェックするフィールド データ メンバーへのポインター。またはNULL
、いずれかのフィールドが Null かどうかを判断します。
戻り値
指定されたフィールド データ メンバーに Null のフラグが設定されている場合は 0 以外。それ以外の場合は 0。
解説
このメンバー関数を呼び出して、レコードセットの指定されたフィールド データ メンバーに Null のフラグが設定されているかどうかを確認します。 (データベースの用語では、Null は "値を持たない" ことを意味し、C++ と同じ NULL
ではありません)。フィールド データ メンバーに Null のフラグが設定されている場合、値がない現在のレコードの列として解釈されます。
Note
このメンバー関数は、一括行フェッチを使用しているレコードセットには適用されません。 一括行フェッチを実装した場合、常に返FALSE
され、IsFieldNull
アサーションが失敗します。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
IsFieldNull
を使用して DoFieldExchange
実装されます。
CRecordset::IsFieldNullable
現在のレコード内の指定したフィールドを Null (値を持たない) に設定できる場合は、0 以外の値を返します。
BOOL IsFieldNullable(void* pv);
パラメーター
pv
状態をチェックするフィールド データ メンバーへのポインター。またはNULL
、いずれかのフィールドを Null 値に設定できるかどうかを判断します。
解説
このメンバー関数を呼び出して、指定されたフィールド データ メンバーが "null 許容" かどうかを判断します (Null 値に設定できます。C++ NULL
は Null と同じではありません。データベースの用語では、"値を持たない" ことを意味します)。
Note
一括行フェッチを実装している場合は、呼び出 IsFieldNullable
すことはできません。 代わりに、メンバー関数を GetODBCFieldInfo
呼び出して、フィールドを Null 値に設定できるかどうかを判断します。 一括行フェッチを実装しているかどうかに関係なく、いつでも呼び出 GetODBCFieldInfo
すことができます。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
Null にできないフィールドには値が必要です。 レコードの追加または更新時にこのようなフィールドを Null に設定しようとすると、データ ソースは追加または更新を拒否し Update
、例外をスローします。 この例外は、呼び出し時ではなく、呼び出Update
SetFieldNull
し時に発生します。
関数の最初の引数に使用するとNULL
、フィールドではなくparam
フィールドにのみ関数がoutputColumn
適用されます。 たとえば、呼び出し
SetFieldNull(NULL);
はフィールドのみをoutputColumn
設定しますNULL
param
。フィールドは影響を受けません。
フィールドで param
作業するには、次のように、作業する個人 param
の実際の住所を指定する必要があります。
SetFieldNull(&m_strParam);
つまり、フィールドの場合と同様outputColumn
に、すべてのparam
フィールドを [] にNULL
設定することはできません。
IsFieldNullable
は DoFieldExchange を使用して実装されます。
CRecordset::IsOpen
レコードセットが既に開いているかどうかを判断します。
BOOL IsOpen() const;
戻り値
レコードセット オブジェクト Open
または Requery
メンバー関数が以前に呼び出され、レコードセットが閉じていない場合は 0 以外。それ以外の場合は 0。
CRecordset::m_hstmt
レコードセットに関連付けられた ODBC ステートメントのデータ構造 (型 HSTMT
) へのハンドルを格納します。
解説
ODBC データ ソースに対する各クエリは、HSTMT
注意事項
呼び出される前にOpen
使用m_hstmt
しないでください。
通常、直接アクセス HSTMT
する必要はありませんが、SQL ステートメントを直接実行するために必要な場合があります。 クラスCDatabase
のメンバー関数はExecuteSQL
、次の使用m_hstmt
例を提供します。
CRecordset::m_nFields
レコードセット クラスのフィールド データ メンバーの数を格納します。つまり、データ ソースからレコードセットによって選択された列の数です。
解説
レコードセット クラスのコンストラクターは、正しい数値で初期化 m_nFields
する必要があります。 一括行フェッチを実装していない場合は、 ClassWizard
この初期化を使用してレコードセット クラスを宣言するときに書き込みます。 手動で記述することもできます。
フレームワークでは、この数値を使用して、フィールド データ メンバーと、データ ソース上の現在のレコードの対応する列の間の相互作用を管理します。
注意事項
この数は、パラメーターCFieldExchange::outputColumn
を使用した呼び出しの後にDoFieldExchange
DoBulkFieldExchange
登録された "出力列" の数に対応しているSetFieldType
必要があります。
「レコードセット: データ列を動的にバインドする」の記事で説明されているように、列を動的にバインドできます。その場合は、動的にバインドされた列の m_nFields
RFX 関数またはメンバー関数内DoFieldExchange
DoBulkFieldExchange
の RFX 関数呼び出しまたは一括 RFX 関数呼び出しの数を反映するために、カウントインを増やす必要があります。
詳細については、「 Recordset: 動的バインディング データ列 (ODBC) 」および 「Recordset: Fetching Records in Bulk (ODBC)」を参照してください。
例
「レコード フィールド交換: RFX の使用」を参照してください。
CRecordset::m_nParams
レコードセット クラスのパラメーター データ メンバーの数を格納します。つまり、レコードセットのクエリで渡されるパラメーターの数です。
解説
レコードセット クラスにパラメーター データ メンバーがある場合、クラスのコンストラクターは正しい数値で初期化 m_nParams
する必要があります。 既定値 m_nParams
は 0 です。 パラメーター データ メンバーを追加する場合 (手動で行う必要があります)、パラメーターの数を反映するために、クラス コンストラクターに初期化を手動で追加する必要もあります (パラメーターの数は、少なくとも自分 m_strFilter
または m_strSort
文字列内の '' プレースホルダーの数と同じにする必要があります)。
フレームワークは、レコードセットのクエリをパラメーター化するときにこの数を使用します。
注意事項
この番号は、パラメーター値が 、CFieldExchange::param
またはを指定して呼び出しの後にDoFieldExchange
DoBulkFieldExchange
登録された "params" のCFieldExchange::inputParam
数にSetFieldType
対応する必要があります。CFieldExchange::inoutParam
CFieldExchange::outputParam
例
「レコードセット: レコードセットのパラメーター化 (ODBC)」および「レコード フィールド交換: RFX の使用」の記事を参照してください。
CRecordset::m_pDatabase
レコードセットがデータ ソースに CDatabase
接続されているオブジェクトへのポインターを格納します。
解説
この変数は 2 つの方法で設定されます。 通常、レコードセット オブジェクトを構築するときに、既に接続 CDatabase
されているオブジェクトへのポインターを渡します。 代わりに渡 NULL
す場合は、 CRecordset
オブジェクトを CDatabase
作成して接続します。 どちらの場合も、 CRecordset
ポインターをこの変数に格納します。
通常、格納されている m_pDatabase
ポインターを直接使用する必要はありません。 ただし、独自の拡張機能を記述する CRecordset
場合は、ポインターを使用する必要がある場合があります。 たとえば、独自 CDBException
のオブジェクトをスローする場合は、ポインターが必要になる場合があります。 または、トランザクションの実行、タイムアウトの設定、SQL ステートメントを直接実行するためのクラスCDatabase
のメンバー関数の呼び出しExecuteSQL
など、同じCDatabase
オブジェクトを使用して何かを行う必要がある場合に必要になることがあります。
CRecordset::m_strFilter
レコードセット オブジェクトを構築した後、そのOpen
メンバー関数を呼び出す前に、このデータ メンバーを使用して、含まれている SQL WHERE
句を格納CString
します。
解説
レコードセットは、この文字列を使用して、選択したレコードを、呼び出し中 Open
に制約 (または Requery
フィルター処理) します。 これは、レコードのサブセット ("カリフォルニアに基づくすべての営業担当者" ("州 = CA") など) を選択する場合に役立ちます。 句の ODBC SQL 構文は次 WHERE
のとおりです。
WHERE search-condition
文字列にWHERE
キーワード (keyword)を含めないでください。 フレームワークによって提供されます。
また、フィルター文字列をパラメーター化するには、その中に '' プレースホルダーを配置し、各プレースホルダーのクラスでパラメーター データ メンバーを宣言し、実行時にパラメーターをレコードセットに渡します。 これにより、実行時にフィルターを構築できます。 詳細については、「レコードセット: パラメーターを利用したレコードセット (ODBC)」を参照してください。
SQL 句の詳細については、SQL WHERE
を参照してください。 レコードの選択とフィルター処理の詳細については、「レコードセット: レコードのフィルター処理 (ODBC)」を参照してください。
例
CCustomer rsCustSet(&m_dbCust);
// Set the filter
rsCustSet.m_strFilter = _T("L_Name = 'Flanders'");
// Run the filtered query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));
CRecordset::m_strSort
レコードセット オブジェクトを構築した後、そのOpen
メンバー関数を呼び出す前に、このデータ メンバーを使用して、含まれている SQL ORDER BY
句を格納CString
します。
解説
レコードセットは、この文字列を使用して、選択したレコードをRequery
呼び出し中にOpen
並べ替えます。 この機能を使用すると、1 つ以上の列でレコードセットを並べ替えることができます。 句の ODBC SQL 構文 ORDER BY
は次のとおりです。
ORDER BY sort-specification [, sort-specification]...
並べ替え指定が整数または列名である場合。 並べ替え文字列の列リストに "ASC" または "DESC" を追加することで、昇順または降順 (既定では昇順) を指定することもできます。 選択したレコードは、最初にリストされた最初の列、次に 2 番目の列で並べ替えられます。 たとえば、姓、名で "Customers" レコードセットを並べ替える場合があります。 一覧表示できる列の数は、データ ソースによって異なります。 詳細については、Windows SDK を参照してください。
文字列にORDER BY
キーワード (keyword)を含めないでください。 フレームワークによって提供されます。
SQL 句の詳細については、SQL を参照してください。 レコードの並べ替えの詳細については、「レコードセット: レコードの並べ替え (ODBC)」を参照してください。
例
CCustomer rsCustSet(&m_dbCust);
// Set the sort string
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");
// Run the sorted query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));
CRecordset::Move
レコードセット内の現在のレコード ポインターを前方または後方に移動します。
virtual void Move(
long nRows,
WORD wFetchType = SQL_FETCH_RELATIVE);
パラメーター
nRows
前後に移動する行の数。 正の値は、レコードセットの末尾に向かって前方に移動します。 負の値は、先頭に向かって後方に移動します。
wFetchType
フェッチする行セットを Move
決定します。 詳細については、「解説」を参照してください。
解説
0 nRows
の値を渡すと、Move
現在のレコードMove
が更新され、現在またはEdit
モードが終了し、現在AddNew
のレコードの値が呼び出される前またはEdit
呼び出される前にAddNew
復元されます。
Note
レコードセット内を移動する場合、削除されたレコードをスキップすることはできません。 詳細については、「 CRecordset::IsDeleted
」を参照してください。 オプション セットを使用して a をCRecordset
skipDeletedRecords
開くと、Move
パラメーターが 0 の場合はnRows
アサートされます。 この動作により、同じデータを使用して他のクライアント アプリケーションによって削除された行が更新されないようにします。 の説明skipDeletedRecords
については、dwOption
パラメーターをOpen
参照してください。
Move
では、レコードセットの位置が行セットごとに変更されます。 の値nRows
wFetchType
に基づいて、Move
適切な行セットをフェッチし、その行セットの最初のレコードを現在のレコードにします。 一括行フェッチを実装していない場合、行セットのサイズは常に 1 になります。 行セットをフェッチする場合は、 Move
直接メンバー関数を CheckRowsetError
呼び出して、フェッチに起因するエラーを処理します。
渡す値に応じて、 Move
他 CRecordset
のメンバー関数と同等です。 特に、値は、より直感的で、多くの場合、現在の wFetchType
レコードを移動するための好ましい方法であるメンバー関数を示し得る。
次の表に、使用可能な値wFetchType
、およびそれに対応するwFetchType
同等のメンバー関数にnRows
wFetchType
基づいてフェッチするMove
行セットを示します。
wFetchType | フェッチされた行セット | 同等のメンバー関数 |
---|---|---|
SQL_FETCH_RELATIVE (既定値) |
現在の行セットの最初の行から開始 nRows する行セット。 |
|
SQL_FETCH_NEXT |
次の行セット。 nRows は無視されます。 |
MoveNext |
SQL_FETCH_PRIOR |
前の行セット。 nRows は無視されます。 |
MovePrev |
SQL_FETCH_FIRST |
レコードセット内の最初の行セット。 nRows は無視されます。 |
MoveFirst |
SQL_FETCH_LAST |
レコードセット内の最後の完全な行セット。 nRows は無視されます。 |
MoveLast |
SQL_FETCH_ABSOLUTE |
0 の場合 nRows > 、レコードセットの先頭 nRows から開始する行セット。 0 の場合 nRows < 、レコードセットの末尾から開始する nRows 行セット。 = 0 の場合 nRows 、ファイルの先頭 (BOF) 条件が返されます。 |
SetAbsolutePosition |
SQL_FETCH_BOOKMARK |
ブックマーク値が対応 nRows する行から始まる行セット。 |
SetBookmark |
Note
前方のみのレコードセットの場合は、Move
値が 〗〗のSQL_FETCH_NEXT
wFetchType
場合にのみ有効です。
Note
レコードセットの先頭または末尾をスクロールした場合 (IsBOF
または 0 以外の値を返す)、関数をMove
呼び出すと、 CDBException
IsEOF
. たとえば、0 以外の値を返しIsBOF
、返さない場合MoveNext
IsEOF
は例外がスローされますがMovePrev
、スローされません。
Note
現在のレコードの更新中または追加中に呼び出 Move
すと、更新は警告なしで失われます。
レコードセット ナビゲーションの詳細については、「 Recordset: Scrolling (ODBC) 」および 「Recordset: Bookmarks and Absolute Positions (ODBC)」を参照してください。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。 関連情報については、Windows SDK の ODBC API 関数 SQLExtendedFetch
を参照してください。
例
// rs is a CRecordset or a CRecordset-derived object
// Change the rowset size to 5
rs.SetRowsetSize(5);
// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);
// Move to the first record in the recordset
rs.MoveFirst();
// Move to the sixth record
rs.Move(5);
// Other equivalent ways to move to the sixth record:
rs.Move(6, SQL_FETCH_ABSOLUTE);
rs.SetAbsolutePosition(6);
// In this case, the sixth record is the first record in the next rowset,
// so the following are also equivalent:
rs.MoveFirst();
rs.Move(1, SQL_FETCH_NEXT);
rs.MoveFirst();
rs.MoveNext();
CRecordset::MoveFirst
最初の行セットの最初のレコードを現在のレコードにします。
void MoveFirst();
解説
一括行フェッチが実装されているかどうかに関係なく、これは常にレコードセットの最初のレコードになります。
レコードセットを開いた直後に呼び出す MoveFirst
必要はありません。 その時点で、最初のレコード (存在する場合) は自動的に現在のレコードになります。
Note
このメンバー関数は、前方のみのレコードセットでは有効ではありません。
Note
レコードセット内を移動する場合、削除されたレコードをスキップすることはできません。 詳細については、 IsDeleted
メンバー関数を参照してください。
注意事項
レコードセットにレコードがない場合、 Move
いずれかの関数を呼び出すと例外がスローされます。 レコードセットにレコードがあるかどうかを確認するには、次を呼び出 IsBOF
します IsEOF
。
Note
現在のレコードの更新または追加中に Move
いずれかの関数を呼び出すと、更新は警告なしで失われます。
レコードセット ナビゲーションの詳細については、「 Recordset: Scrolling (ODBC) 」および 「Recordset: Bookmarks and Absolute Positions (ODBC)」を参照してください。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
例
IsBOF
の例を参照してください。
CRecordset::MoveLast
最後の完全な行セットの最初のレコードを現在のレコードにします。
void MoveLast();
解説
一括行フェッチを実装していない場合、レコードセットの行セット サイズは 1 であるため MoveLast
、レコードセット内の最後のレコードに移動します。
Note
このメンバー関数は、前方のみのレコードセットでは有効ではありません。
Note
レコードセット内を移動する場合、削除されたレコードをスキップすることはできません。 詳細については、 IsDeleted
メンバー関数を参照してください。
注意事項
レコードセットにレコードがない場合、 Move
いずれかの関数を呼び出すと例外がスローされます。 レコードセットにレコードがあるかどうかを確認するには、次を呼び出 IsBOF
します IsEOF
。
Note
現在のレコードの更新または追加中に Move
いずれかの関数を呼び出すと、更新は警告なしで失われます。
レコードセット ナビゲーションの詳細については、「 Recordset: Scrolling (ODBC) 」および 「Recordset: Bookmarks and Absolute Positions (ODBC)」を参照してください。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
例
IsBOF
の例を参照してください。
CRecordset::MoveNext
次の行セットの最初のレコードを現在のレコードにします。
void MoveNext();
解説
一括行フェッチを実装していない場合、レコードセットの行セット サイズは 1 なので MoveNext
、次のレコードに移動します。
Note
レコードセット内を移動する場合、削除されたレコードをスキップすることはできません。 詳細については、 IsDeleted
メンバー関数を参照してください。
注意事項
レコードセットにレコードがない場合、 Move
いずれかの関数を呼び出すと例外がスローされます。 レコードセットにレコードがあるかどうかを確認するには、次を呼び出 IsBOF
します IsEOF
。
Note
また、呼び出す前に呼び出IsEOF
MoveNext
すこともお勧めします。 たとえば、レコードセットの末尾を超えてスクロールした場合、 IsEOF
0 以外の値が返されます。後続の呼び出し MoveNext
では例外がスローされます。
Note
現在のレコードの更新または追加中に Move
いずれかの関数を呼び出すと、更新は警告なしで失われます。
レコードセット ナビゲーションの詳細については、「 Recordset: Scrolling (ODBC) 」および 「Recordset: Bookmarks and Absolute Positions (ODBC)」を参照してください。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
例
IsBOF
の例を参照してください。
CRecordset::MovePrev
前の行セットの最初のレコードを現在のレコードにします。
void MovePrev();
解説
一括行フェッチを実装していない場合、レコードセットの行セット サイズは 1 なので MovePrev
、前のレコードに移動します。
Note
このメンバー関数は、前方のみのレコードセットでは有効ではありません。
Note
レコードセット内を移動する場合、削除されたレコードをスキップすることはできません。 詳細については、 IsDeleted
メンバー関数を参照してください。
注意事項
レコードセットにレコードがない場合、 Move
いずれかの関数を呼び出すと例外がスローされます。 レコードセットにレコードがあるかどうかを確認するには、次を呼び出 IsBOF
します IsEOF
。
Note
また、呼び出す前に呼び出IsBOF
MovePrev
すこともお勧めします。 たとえば、レコードセットの先頭より前にスクロールした場合、 IsBOF
0 以外の値が返されます。後続の呼び出し MovePrev
では例外がスローされます。
Note
現在のレコードの更新または追加中に Move
いずれかの関数を呼び出すと、更新は警告なしで失われます。
レコードセット ナビゲーションの詳細については、「 Recordset: Scrolling (ODBC) 」および 「Recordset: Bookmarks and Absolute Positions (ODBC)」を参照してください。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
例
IsBOF
の例を参照してください。
CRecordset::OnSetOptions
指定した ODBC ステートメントのオプション (選択時に使用) を設定するために呼び出されます。
virtual void OnSetOptions(HSTMT hstmt);
パラメーター
hstmt
HSTMT
オプションを設定する ODBC ステートメントの値。
解説
指定した ODBC ステートメントのオプション (選択時に使用) を設定する呼び出し OnSetOptions
。 フレームワークは、このメンバー関数を呼び出して、レコードセットの初期オプションを設定します。 OnSetOptions
は、スクロール可能なカーソルとカーソルのコンカレンシーに対するデータ ソースのサポートを決定し、それに応じてレコードセットのオプションを設定します。 (選択 OnSetOptions
操作には使用されますが、 OnSetUpdateOptions
更新操作には使用されます)。
ドライバーまたはデータ ソースに固有のオプションを設定するには、オーバーライド OnSetOptions
します。 たとえば、データ ソースが排他的アクセスのオープンをサポートしている場合は、 OnSetOptions
オーバーライドしてその機能を利用できます。
カーソルの詳細については、ODBC を参照してください。
CRecordset::OnSetUpdateOptions
指定した ODBC ステートメントのオプション (更新時に使用) を設定するために呼び出されます。
virtual void OnSetUpdateOptions(HSTMT hstmt);
パラメーター
hstmt
HSTMT
オプションを設定する ODBC ステートメントの値。
解説
指定した ODBC ステートメントのオプション (更新時に使用) を設定する呼び出し OnSetUpdateOptions
。 フレームワークは、レコードセット内のレコードを更新するレコードを HSTMT
作成した後、このメンバー関数を呼び出します。 (選択 OnSetOptions
操作には使用されますが、 OnSetUpdateOptions
更新操作には使用されます)。 OnSetUpdateOptions
スクロール可能なカーソルとカーソルのコンカレンシーに対するデータ ソースのサポートを決定し、それに応じてレコードセットのオプションを設定します。
そのステートメントを使用してデータベースにアクセスする前に、ODBC ステートメントのオプションを設定する場合はオーバーライド OnSetUpdateOptions
します。
カーソルの詳細については、ODBC を参照してください。
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++ ウィザードで既定値の異なる ODBCCRecordset
と DAOCDaoRecordset
両方を操作できます。
これらのレコードセットの種類の詳細については、「Recordset (ODBC)」を参照してください。 関連情報については、Windows SDK の「ブロックカーソルとスクロール可能カーソルの使用」を参照してください。
注意事項
要求された型がサポートされていない場合、フレームワークは例外をスローします。
lpszSQL
次のいずれかを含む文字列ポインター:
NULL
ポインター。テーブルの名前。
SQL
SELECT
ステートメント (必要に応じて SQLWHERE
またはORDER BY
句を含む)。CALL
定義済みのクエリ (ストアド プロシージャ) の名前を指定するステートメント。 中かっことCALL
キーワード (keyword)の間に空白を挿入しないように注意してください。
この文字列の詳細については、「解説」セクションの ClassWizard の役割の表と説明を参照してください。
Note
結果セット内の列の順序は、自分またはDoBulkFieldExchange
関数のオーバーライドでの RFX 関数呼び出しまたは一括 RFX 関数呼び出しのDoFieldExchange
順序と一致する必要があります。
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 に設定して呼び出Move
すと、オプションセットMove
がCRecordset::skipDeletedRecords
アサートされます。CRecordset::skipDeletedRecords
はドライバーのパッキングに似ています。つまり、削除された行はレコードセットから削除されます。 ただし、ドライバーがレコードをパックすると、削除したレコードのみがスキップされます。レコードセットが開いている間、他のユーザーによって削除されたレコードはスキップされません。CRecordset::skipDeletedRecords
は、他のユーザーによって削除された行をスキップします。CRecordset::useBookmarks
サポートされている場合は、レコードセットでブックマークを使用できます。 ブックマークを使用すると、データの取得速度は低下しますが、データ移動のパフォーマンスが向上します。 前方スクロール専用レコードセットでは無効です。 詳細については、「Recordset: Bookmarks and Absolute Positions (ODBC)」を参照してください。CRecordset::noDirtyFieldCheck
フィールドの自動ダーティチェック (ダブル バッファリング) をオフにします。 これにより、パフォーマンスが向上します。ただし、フィールドとメンバー関数を呼び出して、フィールドをダーティとして手動でマークするSetFieldDirty
SetFieldNull
必要があります。 クラスでの二重バッファリングは、クラスCRecordset
でのダブル バッファリングにCDaoRecordset
似ています。 ただし、個々のフィールドでCRecordset
ダブル バッファリングを有効にすることはできません。すべてのフィールドに対して有効にするか、すべてのフィールドに対して無効にします。 オプションCRecordset::useMultiRowFetch
を指定すると、CRecordset::noDirtyFieldCheck
自動的に有効になります。ただし、SetFieldDirty
SetFieldNull
一括行フェッチを実装するレコードセットでは使用できません。CRecordset::executeDirect
準備された SQL ステートメントは使用しないでください。 パフォーマンスを向上させるために、メンバー関数がRequery
呼び出されない場合は、このオプションを指定します。CRecordset::useExtendedFetch
の代わりに実装SQLExtendedFetch
しますSQLFetch
。 これは、前方スクロール専用レコードセットに対してバルク行フェッチを実装するために設計されています。 順方向専用レコードセットでオプションCRecordset::useMultiRowFetch
を指定すると、CRecordset::useExtendedFetch
自動的にオンになります。CRecordset::userAllocMultiRowBuffers
ユーザーは、データのストレージ バッファーを割り当てます。 独自のストレージを割り当てる場合は、このオプションCRecordset::useMultiRowFetch
を使用します。 それ以外の場合、フレームワークは必要なストレージを自動的に割り当てます。 詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。CRecordset::userAllocMultiRowBuffers
指定せずに指定するとCRecordset::useMultiRowFetch
、アサーションが失敗します。
戻り値
オブジェクトが CRecordset
正常に開かれた場合は 0 以外、(呼び出された場合 CDatabase::Open
) は 0 を返します。
解説
レコードセットによって定義されたクエリを実行するには、このメンバー関数を呼び出す必要があります。 呼び出す Open
前に、レコードセット オブジェクトを構築する必要があります。
このレコードセットのデータ ソースへの接続は、呼び出す Open
前にレコードセットを構築する方法によって異なります。 データ ソースに接続されていないレコードセット コンストラクターにオブジェクトを渡 CDatabase
す場合、このメンバー関数はデータベース オブジェクトを開くために使用 GetDefaultConnect
します。 レコードセット コンストラクターに NULL を渡すと、コンストラクターによってオブジェクトが CDatabase
作成され Open
、データベース オブジェクトの接続が試行されます。 このような状況でレコードセットと接続を閉じる方法の詳細については、次を参照してください Close
。
Note
CRecordset
オブジェクトを使用したデータ ソースへのアクセスは常に共有されます。 CDaoRecordset
クラスとは異なり、オブジェクトをCRecordset
使用して排他アクセス権を持つデータ ソースを開くことはありません。
クエリ (通常は SQL SELECT
ステートメント) を呼び出Open
すと、次の表に示す条件に基づいてレコードが選択されます。
パラメーター lpszSQL の値。 |
レコードの選択基準 | 例 |
---|---|---|
NULL |
GetDefaultSQL の返す文字列。 |
|
SQL テーブル名 | DoFieldExchange または DoBulkFieldExchange のテーブル リストのすべての列。 |
"Customer" |
定義済みクエリ (ストアド プロシージャ) の名前 | 返すためにクエリが定義された列。 | "{call OverDueAccts}" |
SELECT column-list FROM table-list |
指定したテーブルの指定した列。 | "SELECT CustId, CustName FROM Customer" |
注意事項
SQL 文字列に余分な空白を挿入しないでください。 たとえば、中かっことCALL
キーワード (keyword)の間に空白を挿入すると、MFC によって SQL 文字列がテーブル名として誤って解釈され、ステートメントに組み込SELECT
まれ、例外がスローされます。 同様に、定義済みのクエリで出力パラメーターを使用する場合は、中かっこと '' 記号の間に空白を挿入しないでください。 最後に、ステートメントの中かっこの前またはステートメント内のCALL
キーワード (keyword)のSELECT
前に空白をSELECT
挿入しないでください。
通常の手順では、NULL
Open
GetDefaultSQL をOpen
呼び出します。 派生クラスを使用している場合は、GetDefaultSQL
指定したCRecordset
テーブル名を指定ClassWizard
します。 代わりに、その他の情報を lpszSQL
パラメーターに指定できます。
渡した内容に関係なく、Open
クエリの最終的な SQL 文字列を作成し (文字列に渡した文字列に lpszSQL
SQL WHERE
とORDER BY
句が追加されている可能性があります)、クエリを実行します。 呼び出Open
し後に呼び出GetSQL
すことで、構築された文字列を調べることができます。 レコードセットが SQL ステートメントを構築し、レコードを選択する方法の詳細については、「レコードセット: レコードセットのレコードの選択方法 (ODBC)」を参照してください。
レコードセット クラスのフィールド データ メンバーは、選択したデータの列に結び付けられています。 いくつかのレコードが返された場合、最初のレコードが現在のレコードになります。
フィルターや並べ替えなど、レコードセットのオプションを設定する場合は、レコードセット オブジェクトを作成した後、呼び出す Open
前にこれらを指定します。 レコードセットが既に開いている後にレコードセット内のレコードを更新する場合は、 を呼び出します Requery
。
その他の例を含む詳細については、「Recordset (ODBC)、Recordset: How Recordsets Select Records (ODBC)」、および「Recordset: Creating and Closing Recordsets (ODBC)」を参照してください。
例
次のコード例は、さまざまな形式の呼び出しを 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();
CRecordset::RefreshRowset
現在の行セット内の行のデータと状態を更新します。
void RefreshRowset(
WORD wRow,
WORD wLockType = SQL_LOCK_NO_CHANGE);
パラメーター
wRow
現在の行セット内の行の 1 から始まる位置。 この値の範囲は、0 から行セットのサイズまでです。
wLockType
更新後に行をロックする方法を示す値。 詳細については、「解説」を参照してください。
解説
0 wRow
の値を渡すと、行セット内のすべての行が更新されます。
使用RefreshRowset
するには、メンバー関数でオプションOpen
を指定して一括行フェッチをCRecordset::useMulitRowFetch
実装する必要があります。
RefreshRowset
は ODBC API 関数 SQLSetPos
を呼び出します。 このパラメーターは wLockType
、実行後 SQLSetPos
の行のロック状態を指定します。 次の表では、次の値について説明します wLockType
。
wLockType | 説明 |
---|---|
SQL_LOCK_NO_CHANGE (既定値) |
ドライバーまたはデータ ソースは、行が以前に呼び出されたのと同じロックまたはロック解除状態 RefreshRowset であることを確認します。 |
SQL_LOCK_EXCLUSIVE |
ドライバーまたはデータ ソースは、行を排他的にロックします。 すべてのデータ ソースがこの種類のロックをサポートしているわけではありません。 |
SQL_LOCK_UNLOCK |
ドライバーまたはデータ ソースによって行のロックが解除されます。 すべてのデータ ソースがこの種類のロックをサポートしているわけではありません。 |
詳細については SQLSetPos
、Windows SDK を参照してください。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
CRecordset::Requery
レコードセットを再構築 (更新) します。
virtual BOOL Requery();
戻り値
レコードセットが正常に再構築された場合は 0 以外。それ以外の場合は 0。
解説
いくつかのレコードが返された場合、最初のレコードが現在のレコードになります。
自分または他のユーザーがデータ ソースに対して行っている追加と削除をレコードセットに反映させるには、レコードセットを呼び出 Requery
して再構築する必要があります。 レコードセットがダイナセットの場合、自分または他のユーザーが既存のレコードに対して行った更新が自動的に反映されます (ただし、追加は反映されません)。 レコードセットがスナップショットの場合は、他のユーザーによる編集と追加と削除を反映するように呼び出すRequery
必要があります。
ダイナセットまたはスナップショットの場合は、新しいフィルターまたは並べ替え、または新しいパラメーター値を使用してレコードセットを再構築するたびに呼び出Requery
します。 呼び出すRequery
前に新しい値を割り当てることで、新しいフィルターまたはm_strSort
並べ替えプロパティをm_strFilter
設定します。 呼び出す Requery
前にパラメーター データ メンバーに新しい値を割り当てることで、新しいパラメーターを設定します。 フィルター文字列と並べ替え文字列が変更されていない場合は、クエリを再利用できるため、パフォーマンスが向上します。
レコードセットの再構築が失敗した場合、レコードセットは閉じられます。 呼び出す前に、メンバー関数を呼び出 Requery
してレコードセットを CanRestart
再クエリできるかどうかを判断できます。 CanRestart
は、それが成功することを Requery
保証しません。
注意事項
あなたが呼び出した後にのみ呼び出 Requery
します Open
.
例
次の使用例は、別の並べ替え順序を適用するためにレコードセットを再構築します。
CCustomer rsCustSet(&m_dbCust);
// Open the recordset
rsCustSet.Open();
// Use the recordset ...
// Set the sort order and Requery the recordset
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");
if (!rsCustSet.CanRestart())
return; // Unable to requery
if (!rsCustSet.Requery())
// Requery failed, so take action
AfxMessageBox(_T("Requery failed!"));
CRecordset::SetAbsolutePosition
指定したレコード番号に対応するレコードにレコードセットを配置します。
void SetAbsolutePosition(long nRows);
パラメーター
nRows
レコードセット内の現在のレコードの 1 から始まる序数位置。
解説
SetAbsolutePosition
は、この序数の位置に基づいて現在のレコード ポインターを移動します。
Note
このメンバー関数は、前方のみのレコードセットでは有効ではありません。
ODBC レコードセットの場合、絶対位置を 1 に設定すると、レコードセット内の最初のレコードが参照されます。0 に設定すると、ファイルの先頭 (BOF) の位置が参照されます。
負の値を SetAbsolutePosition
. この場合、レコードセットの位置はレコードセットの末尾から評価されます。 たとえば、 SetAbsolutePosition( -1 )
現在のレコード ポインターをレコードセット内の最後のレコードに移動します。
Note
絶対位置は、サロゲート レコード番号として使用されるものではありません。 ブックマークは、前のレコードが削除されるときにレコードの位置が変更されるため、特定の位置を保持して戻す場合に推奨される方法です。 また、句を使用して SQL ステートメントを使用 ORDER BY
して作成しない限り、レコードセット内の個々のレコードの順序が保証されないため、レコードセットが再作成された場合、特定のレコードの絶対位置が同じになることは保証できません。
レコードセットのナビゲーションとブックマークの詳細については、「 Recordset: Scrolling (ODBC) 」および 「Recordset: Bookmarks and Absolute Positions (ODBC)」を参照してください。
CRecordset::SetBookmark
指定したブックマークを含むレコードにレコードセットを配置します。
void SetBookmark(const CDBVariant& varBookmark);
パラメーター
varBookmark
特定のレコードの CDBVariant
ブックマーク値を含むオブジェクトへの参照。
解説
ブックマークがレコードセットでサポートされているかどうかを確認するには、次を呼び出します CanBookmark
。 サポートされている場合にブックマークを使用できるようにするには、メンバー関数のパラメーターでオプションをdwOptions
設定CRecordset::useBookmarks
するOpen
必要があります。
Note
ブックマークがサポートされていないか使用できない場合、呼び出し SetBookmark
によって例外がスローされます。 ブックマークは、前方専用レコードセットではサポートされていません。
最初に現在のレコードのブックマークを取得するには、ブックマーク値をオブジェクトに保存する呼び出し GetBookmark
を CDBVariant
行います。 後で、保存されたブックマーク値を使用して呼び出 SetBookmark
すことによって、そのレコードに戻ることができます。
Note
特定のレコードセット操作の後、呼び出すSetBookmark
前にブックマークの永続化をチェックする必要があります。 たとえば、ブックマーク GetBookmark
を取得してから呼び出 Requery
すと、ブックマークが無効になる可能性があります。 安全に呼び出CDatabase::GetBookmarkPersistence
すことができるかどうかをチェックする呼び出しSetBookmark
。
ブックマークとレコードセットナビゲーションの詳細については、「 Recordset: Bookmarks and Absolute Positions (ODBC) 」および 「Recordset: Scrolling (ODBC)」を参照してください。
CRecordset::SetFieldDirty
レコードセットのフィールド データ メンバーに変更または変更されていないフラグを設定します。
void SetFieldDirty(void* pv, BOOL bDirty = TRUE);
パラメーター
pv
レコードセットまたは NUL
L のフィールド データ メンバーのアドレスを格納します。この場合 NULL
、レコードセット内のすべてのフィールド データ メンバーにフラグが設定されます。 (C++ NULL
は、データベース用語では Null と同じではありません。つまり、"値がありません")。
bDirty
TRUE
フィールド データ メンバーが "ダーティ" (変更) としてフラグが設定される場合。 それ以外FALSE
の場合は、フィールド データ メンバーに "クリーン" (変更なし) のフラグが設定されます。
解説
フィールドを変更せずにマークすると、フィールドが更新されず、SQL トラフィックが少なくなります。
Note
このメンバー関数は、一括行フェッチを使用しているレコードセットには適用されません。 一括行フェッチを実装した場合、 SetFieldDirty
アサーションが失敗します。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
フレームワークは、変更されたフィールド データ メンバーがレコード フィールド交換 (RFX) メカニズムによってデータ ソース上のレコードに確実に書き込まれるようにマークします。 通常、フィールドの値を変更すると、フィールドダーティが自動的に設定されるため、自分で呼び出すSetFieldDirty
必要はほとんどありませんが、フィールド データ メンバーの値に関係なく、列が明示的に更新または挿入されるようにしたい場合があります。
関数の最初の引数に使用するとNULL
、フィールドではなくparam
フィールドにのみ関数がoutputColumn
適用されます。 たとえば、呼び出し
SetFieldNull(NULL);
はフィールドのみをoutputColumn
設定しますNULL
param
。フィールドは影響を受けません。
フィールドで param
作業するには、次のように、作業する個人 param
の実際の住所を指定する必要があります。
SetFieldNull(&m_strParam);
つまり、フィールドの場合と同様outputColumn
に、すべてのparam
フィールドを [] にNULL
設定することはできません。
CRecordset::SetFieldNull
レコードセットのフィールド データ メンバーに Null (具体的には値がない) または Null 以外の値としてフラグを設定します。
void SetFieldNull(void* pv, BOOL bNull = TRUE);
パラメーター
pv
レコードセット内のフィールド データ メンバーのアドレスを格納します NULL
。 この場合 NULL
、レコードセット内のすべてのフィールド データ メンバーにフラグが設定されます。 (C++ NULL
は、データベース用語では Null と同じではありません。つまり、"値がありません")。
bNull
フィールド データ メンバーに値なし (Null) のフラグを設定する場合は 0 以外。 フィールド データ メンバーに Null 以外のフラグを設定する場合は、それ以外の場合は 0。
解説
レコードセットに新しいレコードを追加すると、すべてのフィールド データ メンバーが最初に Null 値に設定され、"ダーティ" (変更済み) としてフラグが設定されます。 データ ソースからレコードを取得する場合、その列には既に値が含まれるか、Null になります。
Note
一括行フェッチを使用しているレコードセットでは、このメンバー関数を呼び出さないでください。 一括行フェッチを実装した場合、呼び出すと SetFieldNull
アサーションが失敗します。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
現在のレコードのフィールドに値がないフィールドを指定する場合は、null としてフラグを設定してTRUE
呼び出SetFieldNull
bNull
します。 フィールドが以前に Null とマークされていて、値を指定する場合は、その新しい値を設定します。 を使用して Null フラグ SetFieldNull
を削除する必要はありません。 フィールドを Null にできるかどうかを判断するには、次を呼び出します IsFieldNullable
。
関数の最初の引数に使用するとNULL
、フィールドではなくparam
フィールドにのみ関数がoutputColumn
適用されます。 たとえば、呼び出し
SetFieldNull(NULL);
はフィールドのみをoutputColumn
設定しますNULL
param
。フィールドは影響を受けません。
フィールドで param
作業するには、次のように、作業する個人 param
の実際の住所を指定する必要があります。
SetFieldNull(&m_strParam);
つまり、フィールドの場合と同様outputColumn
に、すべてのparam
フィールドを [] にNULL
設定することはできません。
Note
パラメーターを Null に設定すると、レコードセットを開く前に SetFieldNull
呼び出すとアサーションが発生します。 この場合は、 SetParamNull
.
SetFieldNull
を使用して DoFieldExchange
実装されます。
CRecordset::SetLockingMode
ロック モードを "オプティミスティック" ロック (既定) または "ペシミスティック" ロックに設定します。 更新プログラムのレコードのロック方法を決定します。
void SetLockingMode(UINT nMode);
パラメーター
nMode
次のいずれかの値が enum LockMode
含まれています。
optimistic
オプティミスティック ロックは、更新されるレコードを呼び出し中にのみロックしますUpdate
。pessimistic
ペシミスティック ロックは、呼び出されるとすぐにEdit
レコードをロックし、呼び出しが完了するか、新しいレコードに移動するまでUpdate
ロックを維持します。
解説
レコードセットが更新に使用する 2 つのレコード ロック戦略のうちどれを指定する必要がある場合は、このメンバー関数を呼び出します。 既定では、レコードセットのロック モードは optimistic
. これは、より慎重 pessimistic
なロック戦略に変更できます。 レコードセット オブジェクトを構築して開いた後、呼び出 SetLockingMode
す前に呼び出します Edit
。
CRecordset::SetParamNull
パラメーターに Null (具体的には値を持たない) または Null 以外のフラグを設定します。
void SetParamNull(
int nIndex,
BOOL bNull = TRUE);
パラメーター
nIndex
パラメーターの 0 から始まるインデックス。
bNull
(既定値) の場合 TRUE
、パラメーターには Null のフラグが設定されます。 それ以外の場合、パラメーターには Null 以外のフラグが設定されます。
解説
とは異なり SetFieldNull
、レコードセットを開く前に呼び出 SetParamNull
すことができます。
SetParamNull
は、通常、定義済みのクエリ (ストアド プロシージャ) で使用されます。
CRecordset::SetRowsetCursorPosition
カーソルを現在の行セット内の行に移動します。
void SetRowsetCursorPosition(WORD wRow, WORD wLockType = SQL_LOCK_NO_CHANGE);
パラメーター
wRow
現在の行セット内の行の 1 から始まる位置。 この値の範囲は、1 から行セットのサイズまでです。
wLockType
更新後に行をロックする方法を示す値。 詳細については、「解説」を参照してください。
解説
一括行フェッチを実装する場合、レコードは行セットによって取得されます。ここで、フェッチされた行セットの最初のレコードは現在のレコードです。 行セット内の別のレコードを現在のレコードにするには、次を呼び出します SetRowsetCursorPosition
。 たとえば、メンバー関数とGetFieldValue
組み合わせてSetRowsetCursorPosition
、レコードセットの任意のレコードからデータを動的に取得できます。
使用SetRowsetCursorPosition
するには、メンバー関数でパラメーターOpen
のオプションを指定CRecordset::useMultiRowFetch
して、一括行フェッチをdwOptions
実装する必要があります。
SetRowsetCursorPosition
は ODBC API 関数 SQLSetPos
を呼び出します。 このパラメーターは wLockType
、実行後 SQLSetPos
の行のロック状態を指定します。 次の表では、次の値について説明します wLockType
。
wLockType |
説明 |
---|---|
SQL_LOCK_NO_CHANGE (既定値) |
ドライバーまたはデータ ソースは、行が以前に呼び出されたのと同じロックまたはロック解除状態 SetRowsetCursorPosition であることを確認します。 |
SQL_LOCK_EXCLUSIVE |
ドライバーまたはデータ ソースは、行を排他的にロックします。 すべてのデータ ソースがこの種類のロックをサポートしているわけではありません。 |
SQL_LOCK_UNLOCK |
ドライバーまたはデータ ソースによって行のロックが解除されます。 すべてのデータ ソースがこの種類のロックをサポートしているわけではありません。 |
詳細については SQLSetPos
、Windows SDK を参照してください。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
CRecordset::SetRowsetSize
フェッチ中に取得するレコードの数を指定します。
virtual void SetRowsetSize(DWORD dwNewRowsetSize);
パラメーター
dwNewRowsetSize
特定のフェッチ中に取得する行の数。
解説
この仮想メンバー関数は、一括行フェッチを使用するときに、1 回のフェッチ中に取得する行の数を指定します。 一括行フェッチを実装するには、メンバー関数の CRecordset::useMultiRowFetch
パラメーターにオプションを dwOptions
設定する Open
必要があります。
Note
一括行フェッチを実装せずに呼び出 SetRowsetSize
すと、アサーションが失敗します。
呼び出し前に呼び出SetRowsetSize
Open
して、レコードセットの行セット サイズを最初に設定します。 一括行フェッチを実装するときの既定の行セット サイズは 25 です。
Note
呼び出すとき SetRowsetSize
は注意が必要です。 (dwOptions パラメーターのオプションでCRecordset::userAllocMultiRowBuffers
指定されている) データのストレージを手動で割り当てる場合は、呼び出SetRowsetSize
した後、Open
カーソル ナビゲーション操作を実行する前に、これらのストレージ バッファーを再割り当てする必要があるかどうかをチェックする必要があります。
行セット サイズの現在の設定を取得するには、次を呼び出します GetRowsetSize
。
バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
CRecordset::Update
AddNew
新しいデータまたは編集されたデータをデータ ソースに保存して、またはEdit
操作を完了します。
virtual BOOL Update();
戻り値
1 つのレコードが正常に更新された場合は 0 以外。列が変更されていない場合は 0。 レコードが更新されなかった場合、または複数のレコードが更新された場合は、例外がスローされます。 データ ソースのその他のエラーに対しても例外がスローされます。
解説
or Edit
メンバー関数の呼び出し後に、このメンバー関数をAddNew
呼び出します。 この呼び出しは、またはEdit
操作をAddNew
完了するために必要です。
Note
一括行フェッチを実装している場合は、呼び出 Update
すことはできません。 これにより、アサーションが失敗します。 クラス CRecordset
にはデータの一括行を更新するためのメカニズムは用意されていませんが、ODBC API 関数を使用して独自の関数 SQLSetPos
を記述できます。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
また AddNew
、 Edit
データ ソースに保存するために追加または編集されたデータを配置する編集バッファーを準備します。 Update
はデータを保存します。 変更済みとしてマークまたは検出されたフィールドのみが更新されます。
データ ソースがトランザクションをサポートしている場合は、トランザクションの Update
呼び出し (およびその対応する AddNew
呼 Edit
び出し) の一部を行うことができます。 トランザクションの詳細情報については、「トランザクション (ODBC)」を参照してください。
注意事項
最初にいずれかの呼び出しを行わずに呼び出Update
すとEdit
AddNew
、 Update
CDBException
. 呼び出すAddNew
場合はEdit
、操作を呼び出す前に、またはレコードセットまたはデータ ソース接続を閉じる前に呼び出Update
Move
す必要があります。 それ以外の場合、変更は通知なしで失われます。
エラーの処理 Update
の詳細については、「 レコードセット: レコードセットのレコードの更新方法 (ODBC)」を参照してください。
例
「トランザクション: レコードセットでのトランザクションの実行 (ODBC)」を参照してください。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示