レコードセット: 大量のデータの処理 (ODBC)
このトピックの内容は、MFC ODBC クラスと MFC DAO クラスの両方に該当します。
注意
MFC DAO クラスを使用する場合、大量のデータ項目を管理するには、CLongBinary クラスではなく CByteArray クラスを使用します。 バルク行フェッチを実装した MFC ODBC クラスを使う場合は、CByteArray を使わずに CLongBinary を使います。 バルク行フェッチの詳細については、「レコードセット : バルク行フェッチ (ODBC)」を参照してください。
データベースには、ビットマップ (顔写真や地図、製品写真、OLE オブジェクトなど) などの大きなデータを格納することがあります。 このようなデータは、以下の特徴があるため、バイナリ ラージ オブジェクト (BLOB: Binary Large Object) と呼ばれます。
フィールド値が大きい。
数値データなどの単純なデータ型とは異なり、あらかじめサイズを決定できない。
プログラム上、定型処理を行いにくい。
このトピックでは、バイナリ ラージ オブジェクトを扱うデータベース クラスを作成する方法について説明します。
大型オブジェクトの管理
レコードセットには、バイナリ ラージ オブジェクトの管理作業を軽減する方法が 2 つあります。 CByteArray クラスを使う方法と、CLongBinary クラスを使う方法です。 通常、バイナリ ラージ オブジェクトを管理するには CByteArray の方を優先して使います。
CByteArray は、CLongBinary と比べてオーバーヘッドの面で劣りますが、機能的に優れています (「CByteArray クラス」を参照)。 CLongBinary については、「CLongBinary クラス」で簡単に説明します。
CByteArray を使って大量のデータを処理する方法の詳細については、「テクニカル ノート 45: MFC/データベースの Long Varchar/Varbinary 型のサポート」を参照してください。
CByteArray クラス
CByteArray は、MFC コレクション クラスの 1 つです。 CByteArray オブジェクトは、バイトの動的な配列 (必要に応じて拡張できる配列) を格納します。 このクラスは、組み込み C++ 配列と同様に、インデックスによる高速なアクセスを提供します。 CByteArray オブジェクトは、シリアル化することも、診断用にダンプすることもできます。 このクラスの提供するメンバー関数では、指定されたバイトの取得と設定、バイトの挿入と付加、バイトの個別/一括除去を行うことができます。 これらの機能によって、バイナリ データを簡単に解析できます。 たとえば、バイナリ オブジェクトが OLE オブジェクトの場合は、ヘッダー バイトを通じて実際のオブジェクトに到達できます。
レコードセットでの CByteArray の使用
レコードセットに CByteArray型のフィールド データ メンバーを用意すると、RFX によってレコードセットとデータ ソースとの間でオブジェクトをやり取りするための固定ベースを提供できます。プログラムは、この固定ベースを通じてオブジェクト内のデータも操作できます。 RFX は取得したデータを保存するための専用のサイトを必要とし、プログラムはオブジェクトのデータにアクセスするための方法を必要とします。
CByteArray を使って大量のデータを処理する方法の詳細については、「テクニカル ノート 45: MFC/データベースの Long Varchar/Varbinary 型のサポート」を参照してください。
CLongBinary クラス
CLongBinary オブジェクトは、ヒープ上に確保された領域を指す HGLOBAL ハンドルを中心に構成されています。 バイナリ ラージ オブジェクトを格納したテーブル列が CLongBinary オブジェクトに結び付けられると、RFX は、レコードセットにデータを転送するために HGLOBAL ハンドルにメモリを割り当てて、ハンドルをレコードセットの ClongBinary フィールドに保存します。
これにより、プログラムでは HGLOBAL ハンドル m_hData を通じてデータを操作できます。 この点において、CByteArray は CLongBinary より機能的に優れています。
ヒント
CLongBinary オブジェクトは、関数呼び出しのパラメーターとして使用できません。 また、このオブジェクトの中では ::SQLGetData が使われているため、スナップショットのスクロール速度が低下します。 動的なスキーマ列にアクセスするために直接 ::SQLGetData を呼び出した場合も、スクロール速度が低下します。