ユーザー レコード
更新 : 2007 年 11 月
静的アクセサ (CAccessor から派生したアクセサ) を使用するには、コンシューマがユーザー レコードを保持している必要があります。ユーザー レコードは、入力や出力を処理するためのデータ要素を含む C++ クラスです。ATL OLE DB コンシューマ ウィザードは、コンシューマに対してユーザー レコードを生成します。ユーザー レコードには、コマンドの処理などの省略可能なタスク用のメソッドを追加できます。
次のコードは、コマンドを処理するサンプル レコードです。ユーザー レコードでは、BEGIN_COLUMN_MAP は、プロバイダからコンシューマに渡されるデータ行セットを表します。BEGIN_PARAM_MAP は、一連のコマンド パラメータを表します。この例では、CCommand クラスを使用してコマンド パラメータを処理します。マップ エントリのデータ メンバは、1 つの連続するメモリ ブロック内でのクラスの各インスタンスのオフセットを表します。COLUMN_ENTRY マクロは、プロバイダ側の PROVIDER_COLUMN_ENTRY マクロに対応します。
COLUMN_MAP マクロと PARAM_MAP マクロの詳細については、「OLE DB コンシューマ テンプレート用マクロおよびグローバル関数」を参照してください。
class CArtists
{
public:
// Data Elements
CHAR m_szFirstName[20];
CHAR m_szLastName[30];
short m_nAge;
// Column binding map
BEGIN_COLUMN_MAP(CArtists)
COLUMN_ENTRY(1, m_szFirstName)
COLUMN_ENTRY(2, m_szLastName)
COLUMN_ENTRY(3, m_nAge)
END_COLUMN_MAP()
// Parameter binding map
BEGIN_PARAM_MAP(CArtists)
COLUMN_ENTRY(1, m_nAge)
END_PARAM_MAP()
};
ウィザード生成ユーザー レコード
ATL OLE DB コンシューマ ウィザードでコンシューマを生成する場合は、OLE DB テンプレートまたは OLE DB 属性を使用できます。どちらを使用するかによって、生成されるコードが異なります。このコードの詳細については、「コンシューマ ウィザードで生成されたクラス」を参照してください。
ユーザー レコードによる複数のアクセサのサポート
複数のアクセサを使用する必要がある場合の詳細については、「行セットでの複数アクセサの使用」を参照してください。
次の例は、行セットに対して複数のアクセサをサポートするように変更されたユーザー レコードを示しています。BEGIN_COLUMN_MAP と END_COLUMN_MAP の代わりに、各アクセサに対して BEGIN_ACCESSOR_MAP と BEGIN_ACCESSOR を使用しています。BEGIN_ACCESSOR マクロは、アクセサ番号 (0 からのオフセット) と、アクセサが自動アクセサかどうかを指定します。自動アクセサは、MoveNext が呼び出されると、GetData を呼び出してデータを自動的に取得します。非自動アクセサでは、データを明示的に取得する必要があります。非自動アクセサは、ビットマップ イメージのような、すべてのレコードに対して取得する必要のない大きなデータ フィールドとバインドする場合に使用します。
class CMultiArtists
{
public:
// Data Elements
CHAR m_szFirstName[20];
CHAR m_szLastName[30];
short m_nAge;
// Column binding map
BEGIN_ACCESSOR_MAP(CMultiArtists, 2)
BEGIN_ACCESSOR(0, true) // true specifies an auto accessor
COLUMN_ENTRY(1, m_szFirstName)
COLUMN_ENTRY(2, m_szLastName)
END_ACCESSOR()
BEGIN_ACCESSOR(1, false) // false specifies a manual accessor
COLUMN_ENTRY(3, m_nAge)
END_ACCESSOR()
END_ACCESSOR_MAP()
};