XML データへのアクセス
データソースから XML データを取得するには、CStreamRowset を使う方法と、CXMLAccessor を使う方法の 2 種類があります。
機能 | 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
などのメソッドは、そのポインターを使ってデータを取得します。
一方、(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 サポートの追加を参照してください。
Note
CStreamRowset
による XML サポートは SQL Server 2000 でのみ動作し、OLE DB Provider for SQL Server 2000 (MDAC と共にインストール) が必要です。
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 形式の文字列データとして取得することができます。