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 を呼び出す (たとえば、CRowset を TRowset クラスとして指定する) 場合、IRowset ポインタを取得します。ICommand::Execute は IRowset ポインタを返します。このポインタは、CRowset オブジェクトの m_spRowset メンバに格納されています。MoveFirst、MoveNext、GetData などのメソッドは、そのポインタを使用してデータを取得します。
対照的に、TRowset クラスとして CStreamRowset を指定して 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 は、データ ストアからアクセスされたすべてのデータを 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 形式の文字列データとして取得できます。