次の方法で共有


XML データへのアクセス

データ ソースから XML データを取得するには、2 つの方法があります。1 つは CStreamRowset を使用する方法で、もう 1 つは CXMLAccessor を使用する方法です。

機能

CStreamRowset

CXMLAccessor

転送されるデータの量

すべての列と行のデータを一度に取得します。

すべての列から一度に 1 行だけデータを取得します。MoveNext などのメソッドを使用して行を移動する必要があります。

文字列の書式設定

SQL Server は、書式を XML 文字列に設定し、コンシューマーに送信します。

ネイティブな形式で行セット データを取得 (プロバイダーがそのデータを Unicode 文字列として送信することを要求) し、そのデータを含む文字列を XML 書式で作成します。

書式設定の制御

SQL Server 2000 に固有のプロパティを設定することにより、XML 文字列の書式設定の方法をある程度制御できます。

生成された XML 文字列の書式は制御できません。

CStreamRowset を使用すると、より効率的に XML 形式でデータを取得できますが、この方法は SQL Server 2000 でだけサポートされます。

CStreamRowset を使用した XML データの取得

CCommand または CTable の宣言で、行セットの種類として CStreamRowset を指定します。独自のアクセサーと共に使用するか、またはアクセサーなしで使用できます。たとえば、次のようにします。

CCommand<CAccessor<CMyAccessor>, CStreamRowset> myCmd;

または

CCommand<CNoAccessor, CStreamRowset> myCmd;

通常 CCommand::Open (、 TRowset クラスとしてたとえば、 CRowset を指定する)をダイヤルすると、 IRowsetのポインターを取得します。ICommand::ExecuteCRowset のオブジェクトの m_spRowset のメンバーに格納されます IRowsetのポインターを返します。MoveFirstMoveNextGetData などのメソッドは、このポインターを使用してデータを取得します。

対照的に、CStreamRowset を TRowset クラスとして指定して CCommand::Open を呼び出すと、ICommand::ExecuteISequentialStream ポインターを返します。このポインターは、CStreamRowsetm_spStream データ メンバーに格納されます。その後、Read メソッドを使用して、XML 形式でデータ (Unicode 文字列) を取得できます。次に例を示します。

myCmd.m_spStream->Read()

SQL Server 2000 は、XML 書式設定を実行し、行セットのすべての列とすべての行を 1 つの XML 文字列として返します。

Read メソッドの使用例については、「単純なコンシューマーの実装」の「コンシューマーへの XML サポートの追加」を参照してください。

[!メモ]

CStreamRowset を使用する XML サポートが機能するのは SQL Server 2000 だけです。また、この場合は、(MDAC と共にインストールされる) OLE DB Provider for SQL Server 2000 が必要です。

CXMLAccessor を使用した XML データの取得

CXMLAccessor を使用すると、データ ストアのスキーマについて何も知らなくても、データ ソースのデータを文字列データとしてアクセスできます。CXMLAccessorCDynamicStringAccessorW と同じように動作しますが、データ ストアからアクセスされたすべてのデータを XML 形式の (タグ付き) データとして変換する点が異なります。XML タグ名は、データ ストアの列名に可能な限り一致するように付けられます。

ほかのアクセサー クラスの場合と同様に CXMLAccessor を使用し、テンプレート パラメーターとして CCommand または CTable に渡します。

CTable<CXMLAccessor, CRowset> rs;

GetXMLRowData を使用してテーブルから一度に 1 行のデータを取得し、MoveNext などのメソッドを使用して行を移動します。たとえば、次のようにします。

// Open data source, session, and rowset
hr = rs.MoveFirst();
while( SUCCEEDED(hr) && hr != DB_S_ENDOFROWSET )
{
    CStringW strRowData;
    myCmd.GetXMLRowData(strRowData);

    printf_s( "%S\n", strRowData );

    hr = rs.MoveNext();
}

GetXMLColumnData を使用すると、列 (データ型) 情報を XML 形式の文字列データとして取得できます。

参照

概念

アクセサーの使用