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::Execute は CRowset のオブジェクトの m_spRowset のメンバーに格納されます IRowsetのポインターを返します。MoveFirst、MoveNext、GetData などのメソッドは、このポインターを使用してデータを取得します。
対照的に、CStreamRowset を TRowset クラスとして指定して CCommand::Open を呼び出すと、ICommand::Execute は ISequentialStream ポインターを返します。このポインターは、CStreamRowset の m_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 を使用すると、データ ストアのスキーマについて何も知らなくても、データ ソースのデータを文字列データとしてアクセスできます。CXMLAccessor は CDynamicStringAccessorW と同じように動作しますが、データ ストアからアクセスされたすべてのデータを 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 形式の文字列データとして取得できます。