Доступ к данным XML
Существует два способа получения данных XML из источника: с использованием CStreamRowset или CXMLAccessor.
Функциональная возможность |
CStreamRowset |
CXMLAccessor |
---|---|---|
Количество переданных данных |
Одновременное получение данных из всех столбцов и строк. |
Получение данных из всех столбцов, но только одной строки за один раз. Необходимо переходить между строками, используя такие методы, как MoveNext. |
Форматирование строки |
SQL Server форматирует строку XML и отправляет ее объекту-получателю. |
Получение данных набора строк в собственном формате (для этого требуется, чтобы поставщик отправил их в виде строк в кодировке Юникода) и построение строки, содержащей данные в формате XML. |
Управление форматированием |
Существует несколько уровней управления форматированием строки XML, настраиваемых с помощью настройки свойств SQL Server 2000. |
Управление форматированием создаваемой строки XML недоступно. |
В то время как CStreamRowset предоставляет более эффективный способ получения данных в формате XML, он поддерживается только SQL Server 2000.
Получение данных XML с помощью CStreamRowset
В объявлении CCommand или CTable в качестве типа набора строк пользователь указывает CStreamRowset. Его можно использовать с методом доступа или без него, например:
CCommand<CAccessor<CMyAccessor>, CStreamRowset> myCmd;
– или –
CCommand<CNoAccessor, CStreamRowset> myCmd;
Обычно при вызове CCommand::Open (с указанием, например, CRowset в качестве класса TRowset), он получает указатель IRowset. ICommand::Execute возвращает указатель IRowset, который хранится в элементе m_spRowset объекта CRowset. Методы, например MoveFirst, MoveNext и GetData, используют этот указатель для получения данных.
С другой стороны, при вызове CCommand::Open (но с указанием CStreamRowset в качестве класса TRowset), ICommand::Execute возвращает указатель ISequentialStream, который хранится в элементе данных m_spStream объекта CStreamRowset. После этого используется метод Read, чтобы получить данные (строки в кодировке Юникода) в формате XML. Пример:
myCmd.m_spStream->Read()
SQL Server 2000 выполняет форматирование XML и возвращает все столбцы и строки набора как одну строку XML.
Пример использования метода Read см. в подразделе "Добавление поддержки XML в объект-получатель" раздела Реализация простого объекта-получателя.
Примечание
Поддержка XML с использованием CStreamRowset доступна только для SQL Server 2000 и требует поставщика OLE DB для SQL Server 2000 (установленного с компонентами MDAC).
Получение данных XML с помощью CXMLAccessor
CXMLAccessor позволяет получить доступ к данным из источника данных в виде строковых данных в случае, если отсутствует информация о схеме хранилища данных. CXMLAccessor действует как CDynamicStringAccessorW с той только разницей, что первый преобразует все данные из хранилища в формат XML (с тегами). Имена тегов XML совпадают с названиями столбцов хранилища данных насколько это возможно.
Воспользуйтесь CXMLAccessor как любым другим классом доступа, передав его как параметр шаблона в CCommand или CTable:
CTable<CXMLAccessor, CRowset> rs;
Используйте GetXMLRowData, чтобы получить данные из одной строки таблицы за один раз, и переходите между строками с помощью методов, таких как 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();
}
Чтобы получить информацию столбца (типа данных) как строковые данные в формате XML, воспользуйтесь GetXMLColumnData.