ユーザー レコード
静的アクセサー (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()
};