レコードセット : 大量のデータの処理 (ODBC)
更新 : 2007 年 11 月
このトピックの内容は、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 を呼び出した場合も、スクロール速度が低下します。 |