XML データへのアクセス

更新 : 2007 年 11 月

データ ソースから 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 を呼び出す (たとえば、CRowsetTRowset クラスとして指定する) 場合、IRowset ポインタを取得します。ICommand::ExecuteIRowset ポインタを返します。このポインタは、CRowset オブジェクトの m_spRowset メンバに格納されています。MoveFirstMoveNextGetData などのメソッドは、そのポインタを使用してデータを取得します。

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

myCmd.m_spStream->Read()

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

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

yxzsww18.alert_note(ja-jp,VS.90).gifメモ :

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

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

CXMLAccessor を使用すると、データ ストアのスキーマを初めて使用する場合でも、データ ソースから文字列データとしてデータにアクセスできます。CXMLAccessor は、データ ストアからアクセスされたすべてのデータを XML 形式の (タグ付き) データとして変換する場合を除いて、CDynamicStringAccessorW と同様に動作します。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 形式の文字列データとして取得できます。

参照

概念

アクセサの使用