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)」を参照してください。 ダイナセットとスナップショットに焦点を当てるには、ダイナセットスナップショットに関する記事を参照してください。

継承階層

CObject

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

このメンバー関数は、一括行フェッチを使用しているレコードセットには適用できません。このようなレコードセットは呼び出EditAddNewすことはできません。または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は、カーソル ナビゲーション操作 (たとえば、OpenRequery任意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 は、返されなくなるまで呼び出し SQLExtendedFetchSQL_STILL_EXECUTING続けます。

詳細については SQLError、Windows SDK を参照してください。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。

CRecordset::Close

レコードセットを閉じます。

virtual void Close();

解説

ODBC HSTMT と、レコードセットに割り当てられたフレームワークのすべてのメモリが割り当て解除されます。 通常、呼び出した Close後、C++ レコードセット オブジェクトが割り当てられている場合は削除します new

呼び出した後にもう一度呼び出OpenCloseすことができます。 これにより、レコードセット オブジェクトを再利用できます。 別の方法は呼び出し 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 がスロー されます

とは異なりAddNewEdit呼び出しの後UpdateDelete . 呼び出しが 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) に似ています。 データは、データ ソースからレコードセット オブジェクトに自動的に転送されます。 ただし、呼び出したりAddNewEditDelete変更をデータ ソースに転送したり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::BeginTransEditし。 また、呼び出し CDatabase::CommitTrans は、操作を完了するための呼び出し UpdateEdit 代わりではありません。 トランザクションの詳細については、クラス 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 SQLMoreResultsSQL_INVALID_HANDLEFlushResultSet返すと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)SELECTSELECT前に空白を挿入しないでください。

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::OpenExCDatabase::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。

解説

レコードからレコードまでスクロールする前に、このメンバー関数を呼び出して、レコードセットの最初のレコードの前に移動したかどうかを確認します。 また、レコードセットにレコードが含まれているか空であるかを判断するためにも使用IsBOFIsEOFできます。 呼び出 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レコードにEditAddNew転送されます。

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 、例外をスローします。 この例外は、呼び出し時ではなく、呼び出UpdateSetFieldNullし時に発生します。

関数の最初の引数に使用するとNULL、フィールドではなくparamフィールドにのみ関数がoutputColumn適用されます。 たとえば、呼び出し

SetFieldNull(NULL);

はフィールドのみをoutputColumn設定しますNULLparam。フィールドは影響を受けません。

フィールドで 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を使用した呼び出しの後にDoFieldExchangeDoBulkFieldExchange登録された "出力列" の数に対応しているSetFieldType必要があります。

「レコードセット: データ列を動的にバインドする」の記事で説明されているように、列を動的にバインドできます。その場合は、動的にバインドされた列の m_nFields RFX 関数またはメンバー関数内DoFieldExchangeDoBulkFieldExchangeの 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またはを指定して呼び出しの後にDoFieldExchangeDoBulkFieldExchange登録された "params" のCFieldExchange::inputParam数にSetFieldType対応する必要があります。CFieldExchange::inoutParamCFieldExchange::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 をCRecordsetskipDeletedRecords開くと、Moveパラメーターが 0 の場合はnRowsアサートされます。 この動作により、同じデータを使用して他のクライアント アプリケーションによって削除された行が更新されないようにします。 の説明skipDeletedRecordsについては、dwOptionパラメーターをOpen参照してください。

Move では、レコードセットの位置が行セットごとに変更されます。 の値nRowswFetchTypeに基づいて、Move適切な行セットをフェッチし、その行セットの最初のレコードを現在のレコードにします。 一括行フェッチを実装していない場合、行セットのサイズは常に 1 になります。 行セットをフェッチする場合は、 Move 直接メンバー関数を CheckRowsetError 呼び出して、フェッチに起因するエラーを処理します。

渡す値に応じて、 MoveCRecordset のメンバー関数と同等です。 特に、値は、より直感的で、多くの場合、現在の wFetchType レコードを移動するための好ましい方法であるメンバー関数を示し得る。

次の表に、使用可能な値wFetchType、およびそれに対応するwFetchType同等のメンバー関数にnRowswFetchType基づいてフェッチする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_NEXTwFetchType場合にのみ有効です。

注意事項

レコードセットにレコードがない場合、呼び出し Move は例外をスローします。 レコードセットにレコードがあるかどうかを確認するには、次を呼び出 IsBOF します IsEOF

Note

レコードセットの先頭または末尾をスクロールした場合 (IsBOFまたは 0 以外の値を返す)、関数をMove呼び出すと、 CDBExceptionIsEOF . たとえば、0 以外の値を返しIsBOF、返さない場合MoveNextIsEOFは例外がスローされますが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

また、呼び出す前に呼び出IsEOFMoveNextすこともお勧めします。 たとえば、レコードセットの末尾を超えてスクロールした場合、 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

また、呼び出す前に呼び出IsBOFMovePrevすこともお勧めします。 たとえば、レコードセットの先頭より前にスクロールした場合、 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++ ウィザードで既定値の異なる ODBC CRecordset と DAO CDaoRecordset 両方を操作できます。

これらのレコードセットの種類の詳細については、「Recordset (ODBC)」を参照してください。 関連情報については、Windows SDK の「ブロックカーソルとスクロール可能カーソルの使用」を参照してください。

注意事項

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

lpszSQL
次のいずれかを含む文字列ポインター:

  • NULL ポインター。

  • テーブルの名前。

  • SQL SELECT ステートメント (必要に応じて SQL WHERE または ORDER BY 句を含む)。

  • CALL定義済みのクエリ (ストアド プロシージャ) の名前を指定するステートメント。 中かっことCALLキーワード (keyword)の間に空白を挿入しないように注意してください。

この文字列の詳細については、「解説」セクションの ClassWizard の役割の表と説明を参照してください。

Note

結果セット内の列の順序は、自分またはDoBulkFieldExchange関数のオーバーライドでの RFX 関数呼び出しまたは一括 RFX 関数呼び出しのDoFieldExchange順序と一致する必要があります。

dwOptions
ビットマスク。以下に示す値の組み合わせを指定できます。 これらの値の一部は同時に指定できません。 既定値は none です。

  • CRecordset::none オプションは設定されていません。 このパラメーター値は、他のすべての値と同時に指定できません。 既定では、レコードセットを更新EditDeleteしたり、新しいレコード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すと、オプションセットMoveCRecordset::skipDeletedRecordsアサートされます。 CRecordset::skipDeletedRecordsはドライバーのパッキング似ています。つまり、削除された行はレコードセットから削除されます。 ただし、ドライバーがレコードをパックすると、削除したレコードのみがスキップされます。レコードセットが開いている間、他のユーザーによって削除されたレコードはスキップされません。 CRecordset::skipDeletedRecords は、他のユーザーによって削除された行をスキップします。

  • CRecordset::useBookmarks サポートされている場合は、レコードセットでブックマークを使用できます。 ブックマークを使用すると、データの取得速度は低下しますが、データ移動のパフォーマンスが向上します。 前方スクロール専用レコードセットでは無効です。 詳細については、「Recordset: Bookmarks and Absolute Positions (ODBC)」を参照してください

  • CRecordset::noDirtyFieldCheckフィールドの自動ダーティチェック (ダブル バッファリング) をオフにします。 これにより、パフォーマンスが向上します。ただし、フィールドとメンバー関数を呼び出して、フィールドをダーティとして手動でマークするSetFieldDirtySetFieldNull必要があります。 クラスでの二重バッファリングは、クラス CRecordset でのダブル バッファリングに CDaoRecordset似ています。 ただし、個々のフィールドで CRecordsetダブル バッファリングを有効にすることはできません。すべてのフィールドに対して有効にするか、すべてのフィールドに対して無効にします。 オプション CRecordset::useMultiRowFetchを指定すると、 CRecordset::noDirtyFieldCheck 自動的に有効になります。ただし、 SetFieldDirtySetFieldNull 一括行フェッチを実装するレコードセットでは使用できません。

  • 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挿入しないでください。

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

渡した内容に関係なく、Openクエリの最終的な SQL 文字列を作成し (文字列に渡した文字列に lpszSQL SQL WHEREORDER 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 によって例外がスローされます。 ブックマークは、前方専用レコードセットではサポートされていません。

最初に現在のレコードのブックマークを取得するには、ブックマーク値をオブジェクトに保存する呼び出し GetBookmarkCDBVariant 行います。 後で、保存されたブックマーク値を使用して呼び出 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
レコードセットまたは NULL のフィールド データ メンバーのアドレスを格納します。この場合 NULL、レコードセット内のすべてのフィールド データ メンバーにフラグが設定されます。 (C++ NULL は、データベース用語では Null と同じではありません。つまり、"値がありません")。

bDirty
TRUEフィールド データ メンバーが "ダーティ" (変更) としてフラグが設定される場合。 それ以外FALSEの場合は、フィールド データ メンバーに "クリーン" (変更なし) のフラグが設定されます。

解説

フィールドを変更せずにマークすると、フィールドが更新されず、SQL トラフィックが少なくなります。

Note

このメンバー関数は、一括行フェッチを使用しているレコードセットには適用されません。 一括行フェッチを実装した場合、 SetFieldDirty アサーションが失敗します。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。

フレームワークは、変更されたフィールド データ メンバーがレコード フィールド交換 (RFX) メカニズムによってデータ ソース上のレコードに確実に書き込まれるようにマークします。 通常、フィールドの値を変更すると、フィールドダーティが自動的に設定されるため、自分で呼び出すSetFieldDirty必要はほとんどありませんが、フィールド データ メンバーの値に関係なく、列が明示的に更新または挿入されるようにしたい場合があります。

注意事項

このメンバー関数を呼び出すのは、呼び出 Edit した後、または AddNew.

関数の最初の引数に使用するとNULL、フィールドではなくparamフィールドにのみ関数がoutputColumn適用されます。 たとえば、呼び出し

SetFieldNull(NULL);

はフィールドのみをoutputColumn設定しますNULLparam。フィールドは影響を受けません。

フィールドで 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呼び出SetFieldNullbNullします。 フィールドが以前に Null とマークされていて、値を指定する場合は、その新しい値を設定します。 を使用して Null フラグ SetFieldNullを削除する必要はありません。 フィールドを Null にできるかどうかを判断するには、次を呼び出します IsFieldNullable

注意事項

このメンバー関数を呼び出すのは、呼び出 Edit した後、または AddNew.

関数の最初の引数に使用するとNULL、フィールドではなくparamフィールドにのみ関数がoutputColumn適用されます。 たとえば、呼び出し

SetFieldNull(NULL);

はフィールドのみをoutputColumn設定しますNULLparam。フィールドは影響を受けません。

フィールドで 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 すと、アサーションが失敗します。

呼び出し前に呼び出SetRowsetSizeOpenして、レコードセットの行セット サイズを最初に設定します。 一括行フェッチを実装するときの既定の行セット サイズは 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)」を参照してください。

また AddNewEdit データ ソースに保存するために追加または編集されたデータを配置する編集バッファーを準備します。 Update はデータを保存します。 変更済みとしてマークまたは検出されたフィールドのみが更新されます。

データ ソースがトランザクションをサポートしている場合は、トランザクションの Update 呼び出し (およびその対応する AddNewEdit び出し) の一部を行うことができます。 トランザクションの詳細情報については、「トランザクション (ODBC)」を参照してください。

注意事項

最初にいずれかの呼び出しを行わずに呼び出UpdateすとEditAddNewUpdateCDBException. 呼び出すAddNew場合はEdit、操作を呼び出す前に、またはレコードセットまたはデータ ソース接続を閉じる前に呼び出UpdateMoveす必要があります。 それ以外の場合、変更は通知なしで失われます。

エラーの処理 Update の詳細については、「 レコードセット: レコードセットのレコードの更新方法 (ODBC)」を参照してください。

「トランザクション: レコードセットでのトランザクションの実行 (ODBC)」を参照してください

関連項目

CObject クラス
階層グラフ
CDatabase クラス
CRecordView クラス